BBSˮľÇ廪վ¡Ã¾«»ªÇø

·¢ÐÅÈË: wshu (Ê÷ÉϵÄÀÏ»¢), ÐÅÇø: Unix 
±ê  Ìâ: UNIX FAQ ÖÐÎİæ(Èý) 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Mon May 19 10:07:34 1997) 
 
±¾ÆªÎÄÕ»شðÒÔÏÂÎÊÌâ; 
  
       3.1)§ ÒªÈçºÎµÃÖªÒ»¸öµµ°¸½¨Á¢µÄʱ¼ä£¿ 
       3.2)  ÔÚÖ´ÐРrsh µÄʱºòÒªÔõÑù²ÅÄܲ»±ØµÈÔ¶·½Ö¸ÁîÖ´ÐнáÊø¾Í»Øµ½ shell£¿ 
       3.3)  ÒªÔõÑù²ÅÄܽضÏÒ»¸öµµ°¸? 
       3.4)  ÎªÊ²Ã´Ö´ÐРfind Ê±ËùʹÓõĠ{} ·ûºÅÎÞ·¨´ïµ½ÎÒÔ¤ÆÚµÄ½á¹û? 
       3.5)  ÎÒÒªÈçºÎ¸Ä±äÒ»¸ö symbolic link µÄ permission ÄØ£¿ 
       3.6)  ÎÒÒªÈçºÎ "undelete" Ò»¸öµµ°¸£¿ 
       3.7)  Ò»¸öprocess ÒªÔõÑùÕì²â³ö×Ô¼ºÊÇ·ñÔÚ±³¾°×´Ì¬Ö´ÐÐ? 
       3.8)  ÎªÊ²Ã´ÔÚ Bourne shell µ±ÖУ¬¶Ô»ØÈ¦µÄÊä³öÈëתÏòÎÞ·¨´ïµ½Ô¤ÆÚµÄЧ¹û£¿ 
       3.9)  ÎÒÒªÔõôÔÚÒ»¸ö shell script ÖлòÔÚ±³¾°Ö´ÐР'ftp'¡¢'telnet'¡¢'tip' µÈ 
             interactive µÄ³ÌÊ½ÄØ£¿ 
       3.10) ÔÚ shell script »ò C ³Ìʽµ±ÖУ¬ÒªÔõÑù²ÅÄÜÕÒµ½Ä³¸ö³ÌʽµÄ process ID 
             ÄØ£¿ 
       3.11) ÎÒÒªÔõÑù¾­ÓÉ rsh Ö´ÐÐÔ¶·½Ö¸Áîʱ£¬¼ì²éÔ¶·½Ö¸ÁîµÄ½áÊø×´Ì¬£¿ 
       3.12) Äܲ»ÄܰѠshell ±äÊý´«½ø awk ³Ìʽµ±ÖÐÄØ£¿ 
       3.13) ÒªÔõÑù²ÅÄܱÜÃâÔÚ¼ÇÒäÌåÖÐÁôÏÂzombie processes£¿ 
       3.14) µ±ÎÒÒª´Ó pipe ¶ÁÒ»ÐÐÊäÈëʱ£¬ÒªÈçºÎ²ÅÄÜÈÃÕâÐÐ×ÊÁÏÏñÊÇÖ±½Ó´Ó¼üÅÌÊä 
             Èë¶ø·Ç´ÓÒ»¸ö´ó block buffer À´µÄ£¿ 
       3.15) ÎÒÒªÈçºÎÔÚµµ°¸Ãû×ÖÖмÓÈëÈÕÆÚ£¿ 
       3.16) ÎªÊ²Ã´ÓÐÒ»© script ÊÇÓà#! ... ×öΪµµ°¸µÄ¿ª¶Ë£¿ 
  
 3.1)    ÎÒÒªÈçºÎµÃÖªÒ»¸öµµ°¸½¨Á¢µÄʱ¼ä£¿ 
  
         ºÜÒź¶£¬ÒòΪµµ°¸½¨Á¢µÄʱ¼ä²¢Î´´¢´æÔÚÈκεط½£¬ËùÒÔ´ð°¸ÊÇÎÞ·¨µÃÖª¡£ 
         ¹ØÓÚÒ»¸öµµ°¸ÄãÖ»Äܲ鵽×îºóÐ޸ĵÄʱ¼ä£¨"ls -l")£¬×îºó¶ÁÈ¡µÄʱ¼ä 
         ("ls -lu") Óë inode ¸Ä±äµÄʹ¼ä¡£ÓÐһЩ man pages ½«×îºóÒ»¸öʱ¼äµ± 
         ³ÉÊǽ¨Á¢µÄʱ¼ä£¬ÕâÖÖ˵·¨ÊÇ´íµÄ¡£ÒòΪ mv¡¢ln¡¢chmod¡¢chmod¡¢chown¡¢ 
         chgrp µÈ¶¯×÷¶¼»á¸Ä±äÕâ¸öʱ¼ä¡£ 
  
         ÈôÐè¸üÏ꾡µÄ˵Ã÷¿É²Î¿¼ "stat(2)" µÄ man page. 
  
  
 3.2)    ÔÚÖ´ÐРrsh µÄʱºòÒªÔõÑù²ÅÄܲ»±ØµÈÔ¶·½Ö¸ÁîÖ´ÐнáÊø¾Í»Øµ½ shell£¿ 
         (¹ØÓÚÎÒÃÇËùÌÖÂ۵Ġrsh,Çë²ÎÔÄÎÊÌâ2.7) 
  
         ÒÔÏÂÕâЩƾֱ¾õÏëµ½µÄ´ð°¸¶¼´ï²»µ½Õâ¸öЧ¹û£º 
                 rsh machine command & 
         »ò 
                 rsh machine 'command &' 
  
         ÀýÈç, Ö´ÐРrsh machine 'sleep 60 &' Õâ¸öÃüÁîʱ£¬ÎÒÃÇ¿ÉÒԹ۲쵽£ºrsh²¢ 
         ²»»áÁ¢¿Ì½áÊø£¬¶øÊǵȵ½Ô¶·½µÄ sleep ÃüÁîÍê³ÉÒÔºó²Å½áÊø£¬¼´Ê¹ÎÒÃÇÔÚÔ¶ 
         ·½Ê¹Óñ³¾°·½Ê½Ö´ÐдËÃüÁî¡£ËùÒÔÒªÔõÑù²ÅÄÜÈàrsh ÔÚ sleepÃüÁîÆô¶¯ºóÁ¢ 
         ¿Ì½áÊøÄØ£¿ 
  
         ´ð°¸ÈçÏ£­ 
  
         Èç¹ûÄúÔÚÔ¶¶ËʹÓÃcsh: 
                 rsh machine -n 'command >&/dev/null </dev/null &' 
  
         Èç¹ûÄúÔÚÔ¶¶ËʹÓàsh: 
                 rsh machine -n 'command >/dev/null 2>&1 </dev/null &' 
  
         ÎªÊ²Ã´ÄØ£¿ÒòΪ "-n" »á°Ñ rsh µÄstdin½Óµ½ /dev/null£¬Òò´ËÄú¿ÉÒÔÔÚ±¾µØ 
         »úÆ÷ÒÔ±³¾°·½Ê½Ö´ÐÐÕû¸ö rsh ÃüÁî¡£²»¹ÜÊÇʹÓà-n Ñ¡Ïî»òÕßÔÚÖ¸Áî½áβʹ 
         Óà"/dev/null"£¬ÆäЧ¹û¶¼ÊÇÒ»ÑùµÄ¡£´ËÍâ,ÔÚÔ¶¶Ë»úÆ÷ʹÓõÄÊä³öÈëתÏò£¨Ð´ 
         ÔÚµ¥ÒýºÅÄڵIJ¿·Ý£©»áÈàrsh È϶¨´Ë´ÎÁ¬Ïß¿ÉåÉÐнáÊø£¨ÒòΪÒÑÎÞÆäËûÊä 
         Èë×ÊÁÏ£©¡£ 
  
         ¸½×¢: Èκεµ°¸¶¼¿ÉÒÔÓÃÓÚÔ¶¶Ë»úÆ÷µÄÊä³öÈëתÏò£¬¶ø²»½öÏÞÓÚ /dev/null¡£ 
  
         ÔÚÐí¶à×´¿öÏ£¬Õâ¸ö¸´ÔÓµÄÃüÁîµ±ÖÐÓкܶಿ·Ý¶¼ÊǷDZØÒªµÄ¡£ 
  
  
 3.3)    ÒªÔõÑù²ÅÄܽضÏÒ»¸öµµ°¸? 
  
         BSD µÄº¯Êýftruncate() ¿ÉÒÔÉ趨µµ°¸µÄ³¤¶È¡£µ«ÊDz¢²»ÊÇÿһÖÖ°æ±¾µÄ¶¯×÷ 
         ¶¼Ò»Ñù¡£ÆäËû UNIX µÄ±äÖÖËÆºõÒ²¶¼Ö§Ô®ÆäËû°æ±¾µÄ½Ø¶Ï¹¦ÄÜ¡£ 
  
         Ö§Ô® ftruncateº¯ÊýµÄϵͳ¶à°ë¿É¹éÀàΪÒÔÏÂÈýÖÖ£º 
  
         BSD 4.2 - Ultrix, SGI, LynxOS 
                 -ÎÞ·¨Ê¹ÓýضϹ¦ÄÜÀ´Ôö¼Óµµ°¸³¤¶È 
                 -Ö´Ðнض϶¯×÷²»»áÒÆ¶¯µµ°¸Ö¸±ê 
  
         BSD 4.3 - SunOS, Solaris, OSF/1, HP/UX, Amiga 
                 -¿ÉÒÔÓýضϹ¦ÄÜÀ´Ôö¼Óµµ°¸³¤¶È 
                 -Ö´Ðнض϶¯×÷²»»áÒÆ¶¯µµ°¸Ö¸±ê 
  
         Cray - UniCOS 7, UniCOS 8 
                 -ÎÞ·¨Ê¹ÓýضϹ¦ÄÜÀ´Ôö¼Óµµ°¸³¤¶È 
                 -Ö´Ðнض϶¯×÷»áÒÆ¶¯µµ°¸Ö¸±ê 
  
         ÆäËûϵͳÔò¿ÉÄÜÔÚÒÔÏÂËĸöµØ·½ÓëÖÚ²»Í¬: 
  
         F_CHSIZE - Ö»ÔÚSCO ÉÏ 
                 -ÓÐЩϵͳ¶¨ÒåÁËF_CHSIZE µ«²¢Ã»ÓÐÕæµÄÖ§Ô®´Ë¹¦ÄÜ 
                 -¶¯×÷ÀàËÆBSD 4.3 
  
         F_FREESP - Ö»ÔÚ Interative Unix ÉÏ 
                 -ÓÐЩϵͳ(ÈçInteractive Unix)¶¨ÒåÁËF_FREESP µ«²¢Ã»ÓÐÕæµÄÖ§Ô®´Ë 
                  ¹¦ÄÜ 
                 -¶¯×÷ÀàËÆBSD 4.3 
  
         chsize() - QNX and SCO 
                 -ÓÐЩϵͳ(ÈçInteractive Unix)ÓÐchsize() º¯Êýµ«²¢Ã»ÓÐÕæµÄÖ§Ô® 
                  ´Ë¹¦ÄÜ 
                 -¶¯×÷ÀàËÆBSD 4.3 
  
         ¡¸¿Õ¿ÕÈçÒ²¡¹-ĿǰÕÒ²»µ½ÕâÖÖϵͳ 
                 -Ò²Ðí»áÓÐϵͳÍêÈ«²»Ö§Ô® truncate¹¦ÄÜ 
  
         FAQ Î¬»¤ÕßµÄ×¢½â:ÒÔÏÂÊÇÎÒÔÚ¼¸Äêǰ´ÓÍøÂ·×¥µ½µÄ³Ìʽ£¬Ô­×÷ÕßÒѲ»¿É¿¼£¬ 
                          ²»¹ýS.Spencer Sun <spencer@ncd.com> Ò²¹±Ï×ÁËÒ»·Ý 
                          F_FREESPµÄ¹¦ÄÜ¡£ 
  
               functions for each non-native ftruncate follow 
  
               /* ftruncate emulations that work on some System V's. 
                  This file is in the public domain. */ 
  
               #include 
               #include 
  
               #ifdef F_CHSIZE 
               int 
               ftruncate (fd, length) 
                    int fd; 
                    off_t length; 
               { 
                 return fcntl (fd, F_CHSIZE, length); 
               } 
               #else 
               #ifdef F_FREESP 
               /* The following function was written by 
                  kucharsk@Solbourne.com (William Kucharski) */ 
  
               #include 
               #include 
               #include 
  
               int 
               ftruncate (fd, length) 
                    int fd; 
                    off_t length; 
               { 
                 struct flock fl; 
                 struct stat filebuf; 
  
                 if (fstat (fd, &filebuf) < 0) 
                   return -1; 
  
                 if (filebuf.st_size < length) 
                   { 
                     /* Extend file length. */ 
                     if (lseek (fd, (length - 1), SEEK_SET) < 0) 
                       return -1; 
  
                     /* Write a "0" byte. */ 
                     if (write (fd, "", 1) != 1) 
                       return -1; 
                   } 
                 else 
                   { 
                     /* Truncate length. */ 
                     fl.l_whence = 0; 
                     fl.l_len = 0; 
                     fl.l_start = length; 
                     fl.l_type = F_WRLCK;      /* Write lock on file space. */ 
  
         /* This relies on the UNDOCUMENTED F_FREESP argument to 
            fcntl, which truncates the file so that it ends at the 
            position indicated by fl.l_start. 
            Will minor miracles never cease? */ 
                   if (fcntl (fd, F_FREESP, &fl) < 0) 
                       return -1; 
                   } 
  
                 return 0; 
               } 
               #else 
               int 
               ftruncate (fd, length) 
                    int fd; 
                    off_t length; 
               { 
                 return chsize (fd, length); 
               } 
               #endif 
               #endif 
  
  
 3.4)    ÎªÊ²Ã´Ö´ÐРfind Ê±ËùʹÓõĠ{} ·ûºÅÎÞ·¨´ïµ½ÎÒÔ¤ÆÚµÄ½á¹û? 
  
         Find Ö¸ÁîÓÐÒ»¸ö -exec µÄÑ¡Ïî»áÕë¶Ôÿһ¸öÕÒµ½µÄµµ°¸Ö´ÐÐÒ»¸öÌØÊâ 
         µÄÖ¸Áî¡£Find »á°Ñ³öÏÖ{}µÄµØ·½Öû»³ÉĿǰÕÒµ½µÄµµ°¸Ãû³Æ¡£Òò´Ë£¬ 
         Ò²ÐíÓÐÒ»ÌìÄú»áʹÓàfind Ö¸Áî¶Ôÿһ¸öµµ°¸Ö´ÐÐij¸öÖ¸Á»òÕß¶Ô 
         Ò»¸öĿ¼ִÐÐij¸öÖ¸Áî¡£ 
  
                 find /path -type d -exec command {}/\* \; 
  
         Ï£Íû find ÄÜÒÀÐòÖ´ÐÐÒÔÏÂÖ¸Áî: 
  
                 command directory1/* 
                 command directory2/* 
                 ... 
  
         ²»ÐÒµÄÊÇ£¬find Ö»»áÕ¹¿ª×Ô³ÉÒ»ÌåµÄ {} token£»Èç¹û {} ¸úÆäËû×ÖÔªÏàÁ¬ 
         µÄ»°£¨È磺{}/*£©£¬ÄÇôfind½«²»»áÒÔÄúËùÏëµÄ·½Ê½Õ¹¿ª {}, ¶øÊÇת»»ÎªÒÔ 
         ÏÂÃüÁî 
  
                 command {}/* 
                 command {}/* 
                 ... 
  
         Ò²ÐíÄú¿ÉÒÔ°ÑËüµ±³É bug, Ò²¿ÉÒÔ°ÑËü¿´³ÉÊǹÊÒâÉè¼ÆµÄÌØÒ칦ÄÜ¡£µ«ÎÒÃÇ 
         ¿É²»Ô¸±»Ä¿Ç°Õâ¸öÌØÒ칦ÄܸÉÈÅ¡£ËùÒÔÒªÔõÑù±ÜÃâÕâ¸öÎÊÌâÄØ£¿ÆäÖÐÒ»ÖÖ×ö 
         ·¨ÊÇдһ¸öССµÄ shell script£¬Ãû³Æ¾Í½Ð×ö ./doit ºÃÁË£¬ÆäÄÚÈÝÈçÏ£º 
  
                 command "$1"/* 
  
         ÄÇôÄú¾Í¿ÉÒÔ°ÑÔ­À´µÄÃüÁîÐиÄдΪ 
  
                 find /path -type d -exec ./doit {} \; 
  
         Èç¹ûÄúÏëÊ¡µô ./doit Õâ¸ö shell script, ¿ÉÒÔÕâôд£º 
  
                 find /path -type d -exec sh -c 'command $0/*' {} \; 
  
         (ÕâÖÖд·¨¿ÉÐеÄÔ­ÒòÊÇ "sh -c 'command' A B C ..."Ö¸Áîµ±ÖУ¬$0»áÕ¹¿ªÎª 
         A, $1»áÕ¹¿ªÎªB, ÒÀ´ËÀàÍÆ) 
  
         »òÕßÄúÒ²¿ÉÒÔÂÔʩС¼ÆÊ¹Óàsed À´Ôì³öÄúÏëÖ´ÐеÄÖ¸ÁîÐУº 
  
                 find /path -type d -print | sed 's:.*:command &/*:' | sh 
  
         Èç¹ûÄúÏë¼õÉÙ command µÄÖ´ÐдÎÊý£¬Äú¿ÉÒÔÏȼì²é¿´¿´ÏµÍ³ÖÐÓÐûÓР
         xargs Õâ¸öÖ¸Áî, xargs»á´Ó±ê×¼ÊäÈëÒ»´Î¶ÁȡһÐУ¬²¢ÇÒ°ÑÕâЩ¶ÁÈëµÄ×ÊÁÏ 
         ºÏ²¢ÖÁÒ»¸öÃüÁîÐÐÄÚ¡£Äú¿ÉÒÔд³ÉÒÔÏÂÃüÁîÐУº 
  
                 find /path -print | xargs command 
  
         ÕâÑù»áʹÒÔÏÂÖ¸ÁîÖ´ÐÐÒ»´Î»ò¶à´Î£º 
  
                 command file1 file2 file3 file4 dir1/file1 dir1/file2 
  
         ºÜ²»Ðҵأ¬Õâ²¢²»ÊÇÍêÃÀÎÞȱ»òÕßÍòÎÞһʧµÄ½â·¨£¬ÊäÈë xargs µÄÎÄ×ÖÐР
         ±ØÐëÒÔ»»ÐÐ×ÖÔª½á⣬ËùÒÔµ±µµ°¸Ãû³Æµ±ÖÐÓÐÆæ¹ÖµÄ×ÖÔª£¨Èç»»ÐÐ×ÖÔª£©Ê±£¬ 
         xargs¾Í»áÒò´Ë¶ø»ìÏý¡£ 
  
  
 3.5)  ÎÒÒªÈçºÎ¸Ä±äÒ»¸ö symbolic link µÄ permission ÄØ£¿ 
  
         Õâ¸öÎÊÌâûÓÐÒâÒ壬ÒòΪ symbolic linkµÄ permission ¸ù±¾²»´ú±íʲô¡£ 
         ÄǸö link ËùÖ¸¹ýÈ¥µÄµµ°¸µÄ permission ²ÅÓÐÒâÒå¡£ 
  
  
 3.6)  ÎÒÒªÈçºÎ "undelete" Ò»¸öµµ°¸£¿ 
  
         Ä³ÄêijÔµÄijһÌ죬Ҫɾ³ý "*.foo" È´Ò»²»Ð¡ÐÄ´ò³ÉÁË "rm * .foo"£¬ 
         ½á¹û·¢ÏÖ¾¹°Ñ "*" ¶¼É¾³ýÁË¡£ÕæµÄÊÇÓû¿ÞÎÞÀá°¡£¡¿ÉÊÇÄãÒ²Ö»ºÃ°ÑÕâµ±³É 
         Êdzɳ¤µÄ´ú¼ÛÁË¡£ 
  
         µ±È»Ò»¸ö³ÆÖ°µÄϵͳ¹ÜÀíÔ±Ó¦µ±»á¶¨ÆÚ×ö±¸·Ý¡£ÏÈÎÊÒ»ÎÊÄãµÄϵͳ¹ÜÀíÔ±¿´ 
         Ä㲻СÐÄɾ³ýµÄµµ°¸ÊDz»ÊÇÓб¸·ÝÆðÀ´¡£Èç¹ûûÓеϰ£¬àÅ£¬¼ÌÐøÍùÏ¿´°É£¡ 
  
         ²»¹ÜÄãÊDz»ÊÇÕæµÄҪɾ³ýÒ»¸öµµ°¸£¬µ±ÄãÏÂÁË "rm" ÒԺ󣬵µ°¸¾Í²»¼ûÁË¡£ 
         ÔÚÄã "rm" Ò»¸öµµ°¸£¬ÏµÍ³¾Í²»ÔټǵÃÄãµÄµµ°¸ÊÇÓÃÁËÓ²µúÖеÄÄÄЩ block 
         ÁË¡£¸üÔã¸âµÄÊÇ£¬µ±ÏµÍ³ÒªÓõ½¸ü¶àµÄÓ²µú¿Õ¼äʱ£¬¾ÍÓÅÏÈÈ¡ÓÃÕâЩ¸Õ·Å³ö 
         À´µÄ block¡£²»¹ýÌìµ×ÏÂûÓв»¿ÉÄܵÄÊ¡£ÀíÂÛÉÏ˵£¬ÈôÄãÔÚÏÂÁË "rm" ºó£¬ 
         ÂíÉϰÑϵͳ shutdown£¬×ÊÁÏÊǾ͵ûØÀ´µÄ¡£²»¹ý£¬ÄãµÃÕÒÒ»¸ö¶Ôϵͳ·Ç³£ 
         ÊìϤÇÒ¿Ï»¨·ÑÊýСʱÖÁÊýÌìµÄʱ¼äÀ´°ïÄã×öÕâ¼þÊÂר¼Ò²ÅÐС£ 
  
         µ±Ä㲻СÐÄ "rm" ÁËÒ»¸öµµ°¸ºó£¬µÚÒ»¸ö·´Ó¦»òÐíÊÇΪʲô²»ÓÃÒ»¸ö alias 
         »òÔÚ sh ÖеĠfunction ½« "rm"  È¡´úµô£¬µ±ÄãÏ "rm" Ö»°Ñµµ°¸°áµ½Ò»¸ö 
         À¬»øÍ°Ö®ÀàµÄµØ·½ÄØ£¿ÄÇÈç¹û²»Ð¡ÐÄɱ´íµµ°¸¾Í¿ÉÒÔÍì¾È£¬Ö»ÊÇÒª¶¨ÆÚÇåÒ» 
         ÇåÀ¬»øÍ°¾ÍºÃÁË¡£ÓÐÁ½¸öÀíÓÉ¡£µÚÒ»£¬´ó¶àÊýµÄÈ˲»ÈÏΪÕâÊÇÒ»¸öºÃµÄ×ö·¨¡£ 
         Õâô×öµÄ»°Äã»áÌ«ÒÀÀµÄãµÄ "rm"£¬ÓÐÒ»Ììµ½ÁËÒ»¸öÕý³£µÄϵͳÖаÑÕý³£µÄ 
         "rm" µ±³ÉÄãµÄ "rm" À´Óã¬ÄÇ¿ÉÄÜ»áËÀµÃºÜ²Ò¡£µÚ¶þ£¬Äã»á·¢ÏÖÄ㻨·ÑÁË 
         Ðí¶à²»±ØÒªµÄʱ¼äÔÚ´¦ÀíÀ¬»øÍ°ÀïµÄ¶«Î÷¡£ËùÒÔ¶ÔÒ»¸ö³õѧÕß¶øÑÔÄØ£¬Óà
         "rm" µÄ -iÑ¡ÏîÓ¦¸Ã¾Í¹»ÁË¡£ 
  
         Èç¹ûÄãÓдóÎÞηµÄ¾«ÉñµÄ»°£¬ÄǺðɣ¬¾Í¸øÄã¸ö¼òµ¥µÄ´ð°¸¡£Ð´Ò»¸öÃûΪ 
         "can" µÄÖ¸Á¹¦ÓÃÊǽ«µµ°¸ÒƵ½À¬»øÍ°Àï¡£ÔÚ csh(1) ÖУ¬½«ÒÔÏµĶ«Î÷ 
         ·Å½ø ".login" Àï: 
  
         alias can       'mv \!* ~/.trashcan'       # junk file(s) to trashcan 
         alias mtcan     'rm -f ~/.trashcan/*'      # irretrievably empty trash 
         if ( ! -d ~/.trashcan ) mkdir ~/.trashcan  # ensure trashcan exists 
  
         Èç¹ûÄãÏëҪÿ´Î logout Ê±¶¼°ÑÀ¬»øÍ°ÇåǬ¾»£¬ÄǾͰѠ
  
         rm -f ~/.trashcan/* 
  
         ½ø ".logout" Àï¡£ÈôÄãÓõÄÊÇ sh »òÊÇ ksh£¬ÄÇ×Ô¼ºÊÔÊÔÖøÐ´Ð´¿´°É£¡ 
  
         MIT µÄÑŵäÄȼƻ­(Project Athena)×÷³öÁËÒ»Ì×ÓР
         delete/undelete/expunge/purge µÄÈíÌå¡£ÕâÌ×ÈíÌå¿ÉÒÔÍêȫȡ´ú "rm" ¶øÓÖÌá 
         ¹© undelete µÄ¹¦ÄÜ¡£Õâ¸öÈíÌåÔø post ÔÚ comp.sources.misc(volume 17£¬ 
         issue 023-025)¡£ 
  
  
 3.7)    Ò»¸öprocess ÒªÔõÑùÕì²â³ö×Ô¼ºÊÇ·ñÔÚ±³¾°×´Ì¬Ö´ÐÐ? 
  
         Ê×ÏÈ,ÄúÊÇ·ñÏëÖªµÀÄú×Ô¼ºÊÇÔÚ±³¾°×´Ì¬ÏÂÖ´ÐУ¬»òÕßÔÚ½»Ì¸×´Ì¬ÏÂÖ´ÐУ¿Èç¹û 
         ÄúÖ»ÊÇÏë½å´Ë¾ö¶¨ÊÇ·ñ¸ÃÔÚÖÕ¶ËÉÏÓ¡³öÌáʾ·ûºÅÖ®ÀàµÄѶϢ£¬ÄÇô¸üºÏÊʵķ½ 
         ·¨Ó¦¸ÃÊǼì²éÄúµÄ±ê×¼ÊäÈëÊÇ·ñΪÖÕ¶Ë»ú: 
  
             sh: if [ -t 0 ]; then ... fi 
             C: if(isatty(0)) { ... } 
  
         Ò»°ãÀ´Ëµ£¬ÄúÎÞ·¨µÃÖª×Ô¼ºÊÇ·ñÔÚ±³¾°×´Ì¬ÏÂÖ´ÐС£ÎÊÌâµÄ¸ù±¾ÔÚÓÚ²»Í¬µÄ shell 
         Ó벻ͬµÄ UNIX °æ±¾¶ÔÓÚ¡¸Ç°¾°¡¹Ó롸±³¾°¡¹µÄ¶¨Òå¿ÉÄÜÓÐËù²»Í¬¡£¶øÇÒÔÚ×î 
         ³£¼ûµÄϵͳÉÏ£¬Ç°¾°Óë±³¾°¶¼ÓнϺõ͍Ò壬³ÌʽÉõÖÁ¿ÉÒÔÔÚ±³¾°Óëǰ¾°Ö®¼äÈΠ
         ÒâÇл»£¡ 
  
         ÔÚûÓРjob control µÄUNIXϵͳÉÏ£¬ÈôÒª°Ñ process ·ÅÈë±³¾°×´Ì¬Í¨³£ÊǰѠ
         SIGINT Óë SIGQUIT ºöÂÔµô£¬²¢ÇҰѱê×¼ÊäÈëתΪ"/dev/null"£¬ÕâÊÇÓÉshell´¦ 
         ÀíµÄ¡£ 
  
         ÔÚ¾ßÓРjob control ¹¦ÄܵĠUNIX ÏµÍ³£¬ÈôshellÖ§Ô® job control ¹¦ÄÜ£¬ÄÇôshell 
         Ö»Òª°Ñ process group ID Éè³É¸ú terminal ËùÊôµÄ PGID ²»Í¬¼´¿É°Ñ process ÇР
         »»ÖÁ±³¾°×´Ì¬£»Èç¹ûÒª°Ñ process ÇлØÇ°¾°×´Ì¬£¬Ö»Òª°Ñ´Ë process µÄ PGID Éè 
         ³É¸úĿǰ terminal ËùÊôµÄ PGID ¼´¿É¡£Èç¹û shell ²»Ö§Ô® job control ¹¦ÄÜ£¬Ôò 
         ²»¹ÜUNIX ÏµÍ³ÊÇ·ñÖ§Ô® job control µÄ¹¦ÄÜ£¬shell ¶Ô process µÄ´¦Àí¶¯×÷¶¼ 
         ÊÇÒ»ÑùµÄ£¨Ò²¾ÍÊǺöÂÔSIGINT Óë SIGQUIT£¬²¢ÇҰѱê×¼ÊäÈëתΪ"/dev/null"£©¡£ 
  
  
 3.8)    ÎªÊ²Ã´ÔÚ Bourne shell µ±ÖУ¬¶Ô»ØÈ¦µÄÊä³öÈëתÏòÎÞ·¨´ïµ½Ô¤ÆÚµÄЧ¹û£¿ 
  
         ¾Ù¸öÀý×ÓÀ´ËµºÃÁË£º 
  
                 foo=bar 
                 while read line 
                 do 
                 # do something with $line 
                     foo=bletch 
                 done < /etc/passwd 
  
                 echo "foo is now: $foo" 
  
         ¾¡¹Ü "foo=bletch" ÒѾ­É趨ÁË foo µÄÖµ£¬È»¶øÔÚ¶àÖÖϵͳµÄ Bourne shell 
         ÉÏÖ´Ðдˠscript µÄʱºòÈÔ»áÓ¡³ö "foo is now: bar"¡£ÎªÊ²Ã´ÄØ£¿ÒòΪһЩ 
         ÀúÊ·ÒòËØ£¬ÔÚ Bourne shell µ±ÖУ¬Ò»¸ö¿ØÖƽṹ£¨ÈçÒ»¸ö»ØÈ¦£¬»òÕßÒ»¸ö 
         "if" ÐðÊö£©µÄÖØµ¼Ïò»áÔì³öÒ»¸öеĠsubshell£¬ËùÒÔÀ²£¬ÔÚ´Ë subshell ÄÚ 
         ËùÉ趨µÄ±äÊýµ±È»²»»áÓ°ÏìĿǰ shell µÄ±äÊý¡£ 
  
         POSIX 1003.2 Shell and Tools Interface µÄ±ê׼ίԱ»áÒÑ·ÀÖ¹ÉÏÊöµÄÎÊÌ⣬ 
         Ò²¾ÍÊÇÉÏÊöµÄÀý×ÓÔÚ×ñÑ­P1003.2 ±ê×¼µÄBourne shellsµ±ÖлáÓ¡³ö 
         "foo is now: bletch"¡£ 
  
         ÔÚһЩ½Ï¹ÅÀϵĠ(ÒÔ¼°×ñÑ­ P1003.2 ±ê×¼µÄ) Bourne shell µ±ÖУ¬Äú¿ÉÒÔʹ 
         ÓÃÒÔϼ¼ÇÉÀ´±ÜÃâÖØ×ªÏòµÄÎÊÌ⣺ 
  
                 foo=bar 
                 # make file descriptor 9 a duplicate of file descriptor 0 stdin); 
                 # then connect stdin to /etc/passwd; the original stdin is now 
                 # `remembered' in file descriptor 9; see dup(2) and sh(1) 
                 exec 9<&0 < /etc/passwd 
  
                 while read line 
                 do 
                 # do something with $line 
                     foo=bletch 
                 done 
  
                 # make stdin a duplicate of file descriptor 9, i.e. reconnect 
                 # it to the original stdin; then close file descriptor 9 
                 exec 0<&9 9<&- 
                 echo "foo is now: $foo" 
  
         ÕâÑù×Ó²»¹ÜÔÚÄÄÖÖ Bourne shell Ó¦¸Ã¶¼»áÓ¡³ö "foo is now: bletch"¡£ 
         ½ÓÏÂÀ´£¬¿´¿´ÒÔÏÂÕâ¸öÀý×Ó£º 
  
                 foo=bar 
  
                 echo bletch | read foo 
  
                 echo "foo is now: $foo" 
  
         Õâ¸öÀý×ÓÔÚÐí¶à Bourne shell ÄÚ¶¼»áÓ¡³ö "foo is now: bar"£¬ÓÐЩÔò»á 
         Ó¡³ö "foo is now: bletch"¡£ÎªÊ²Ã´ÄØ£¿Ò»°ã˵À´£¬Ò»¸ö pipeline ÀïÃæ 
         µÄÿһ¸ö²¿·Ý¶¼ÊÇÔÚÒ»¸ö subshell ÖÐÖ´ÐС£µ«ÊÇÓÐЩϵͳµÄÀï pipeline 
         µÄ×îºóÒ»ÐÐÈç¹ûÊÇÈç "read" ÕâÀàµÄÄÚ½¨Ö¸Á²¢²»»áÁíÍâÔì³öÒ»¸ö 
         subshell¡£ 
  
         POSIX 1003.2 ¶ÔÕâÁ½ÖÖ×÷·¨²¢Ã»ÓÐÓ²ÐԹ涨ҪÓÃÄÄÒ»ÖÖ¡£ËùÒÔÒ»¸ö portable 
         µÄ shell script ²»Ó¦¸ÃÒÀÀµÕâÁ½ÖÖ×÷·¨ÆäÖеÄÒ»ÖÖ¡£ 
  
 
 3.9)  ÎÒÒªÔõôÔÚÒ»¸ö shell script ÖлòÔÚ±³¾°Ö´ÐР'ftp'¡¢'telnet'¡¢'tip' µÈ 
       interactive µÄ³ÌÊ½ÄØ£¿ 
  
         ÕâЩ³ÌʽҪһ¸ö terminal interface¡£ÕâÊÇshell ËùÎÞ·¨ÌṩµÄ¡£ËùÒÔÕâЩ 
         ÎÞ·¨ÔÚ shell script Àï×Ô¶¯Ö´ÐÐÕâЩ³Ìʽ¡£ 
  
         ÓÐÒ»¸ö¾Í×ö 'expect' µÄ³Ìʽ£¬¿ÉÒÔÓÃÀ´×öÕâ¼þÊ£¬ÒòΪËüÌṩÁË 
         programmable terminal interface¡£µ×ϵÄÀý×ÓÊÇÓà'expect' À´°ïÄã login£º 
  
                 # username is passed as 1st arg, password as 2nd 
                 set password [index $argv 2] 
                 spawn passwd [index $argv 1] 
                 expect "*password:" 
                 send "$password\r" 
                 expect "*password:" 
                 send "$password\r" 
                 expect eof 
  
         expect Îª telnet, rlogin,debugger ºÍһЩûÓÐÄÚ½¨ command language µÄ 
         ³ÌʽÌṩÁËÒ»¸ö½üºõ×Ô¶¯»¯µÄ·½·¨¡£Expect ÀïÃæµÄÓÐÒ»ÓÃÒÔÔÚÍæ rogue 
         (Ò»¸ö Unix ÖеĹÅÀÏÓÎÏ·£©Ê±È¡µÃ½Ï¼Ñ³õʼÇé¿ö£¬È»ºó½«¿ØÖÆÈ¨»¹»Ø¸øÊ¹ÓÃÕß 
         µÄÀý×Ó¡£ÓÃÕâ¸ö script Äã¾ÍÄܵõ½¡º³É¹¦µÄÒ»°ë¡»¡£ 
  
         ÔÙÕߣ¬ÓÐһЩÒѾ­Ð´ºÃµÄ³Ìʽ¿ÉÒÔ°ïÄãÕâÀàÓë pseudo-tty ÓйصĶ«Î÷£¬Ëù 
         ÒÔÄãÖ»ÒªÚ script ÖÐÖ´ÐÐÕâЩ³Ìʽ¾Í¿ÉÒÔ°ïÄã´¦ÀíÕâЩ¶«Î÷¡£ 
  
         ÓÐÁ½¸ö·½·¨¿ÉÒÔÈ¡µÃ 'expect': 
         1.ËÍÒ»·â email ¸ø library@cme.nist.gov ÄÚÈݾÍд "send 
           pub/expect/expect.shar.Z" 
         2. ftp://ftp.cme.nist.gov/pub/expect/expect.shar.Z 
  
         ÁíÒ»¸ö×ö·¨ÊÇÓÃÒ»¸ö¾Í pty 4.0 ÔøÌùÔÚ comp.sources.unix volume25µÄ¶« 
         Î÷¡£Õâ¸ö³Ìʽ»áÌṩһ¸ö pseudo-tty session ¸øÐèÒª tty µÄ³ÌʽÓá£ÈôʹÓà
         named pipe ÅäºÏ pty 4.0 À´×öÉÏÀý£¬Ôò¿´ÆðÀ´¿ÉÄÜÈçÏ£º 
  
                #!/bin/sh 
                 /etc/mknod out.$$ p; exec 2>&1 
                 ( exec 4<out.$$; rm -f out.$$ 
                 <&4 waitfor 'password:' 
                     echo "$2" 
                 <&4 waitfor 'password:' 
                     echo "$2" 
                 <&4 cat >/dev/null 
                 ) | ( pty passwd "$1" >out.$$ ) 
  
         ÉÏÃæµÄ 'waitfor' ÊǼòµ¥µÄ C ³Ìʽ£¬¹¦ÓÃΪµÈµ½ input ÓÐÓëËùµÈ´ýµÄ×Ö´® 
         ÏàͬʱÔÙÍùÏÂ×ö¡£ 
  
         ÏÂÃæÊÇÒ»¸ö¸ü¼òµ¥µÄ×ö·¨£¬²»¹ýȱµãÊÇÓë 'passwd' ³ÌʽµÄ»¥¶¯¿ÉÄÜÎÞ·¨Í¬ 
         ²½¡£ 
  
                 #!/bin/sh 
                 ( sleep 5; echo "$2"; sleep 5; echo "$2") | pty passwd "$1" 
  
  
 3.10)   ÔÚ shell script »ò C ³Ìʽµ±ÖУ¬ÒªÔõÑù²ÅÄÜÕÒµ½Ä³¸ö³ÌʽµÄ process ID 
         ÄØ£¿ 
  
         ÔÚ shell script µ±ÖÐ: 
  
         Ã»ÓÐÏֳɵijÌʽ¿ÉÒÔÓÃÀ´²éѯ³ÌʽÃû³ÆÓë process ID Ö®¼äµÄ¶ÔÓ¦¡£´ËÍ⣬ 
         Èç¹ûÓжÔÓ¦µÄ»°£¬Í¨³£Ò²¶¼²»Ì«¿ÉÐÅ£¬ÒòΪ¿ÉÄÜ»áÓжà¸ö process Ö´ÐÐͬһ 
         ¸öÃû³ÆµÄ³Ìʽ£¬¶øÇÒ process ÔÚÆô¶¯Ö®ºóÈÔ¿ÉÐÞ¸Ä×Ô¼ºµÄÃû³Æ¡£È»¶ø£¬Èç¹û 
         ÄúÕæµÄÏëÒªµÃÖªÖ´ÐÐij¸öÌØ¶¨³ÌʽµÄËùÓРprocess, ¿ÉÒÔÀûÓÃÒÔÏÂÃüÁîÐдï 
         ³É£º 
                 ps ux | awk '/name/ && !/awk/ {print $2}' 
  
         Äú¿ÉÒÔ°Ñ "name" »»³ÉÄúÏëѰÕҵijÌʽÃû³Æ¡£ 
  
         Õâ¸öÃüÁîÐеĻù±¾¹ÛÄîÊÇ·ÖÎö ps ³ÌʽµÄÊä³ö£¬È»ºóÓàawk»ògrepµÈ¹«Óà
         ³ÌʽÀ´ËÑѰ¾ßÓÐÌØ¶¨Ãû³ÆµÄÎÄ×ÖÐУ¬È»ºó°ÑÕâЩÎÄ×ÖÐе±ÖеĠPID À¸Î»Ó¡ 
         ³öÀ´¡£ÖµµÃ×¢ÒâµÄÊÇ´ËÀýµÄÃüÁîÐÐÓÃÁË "!/awk/" ÒÔ±ÜÃâ awk µÄ process ±» 
         ÁгöÀ´¡£ 
  
         Äú¿ÉÄÜÒª¸ù¾ÝÄúËùÓõĠUnix ÖÖÀàÀ´µ÷Õû ps ËùÓõIJÎÊý¡£ 
  
         ÔÚ C ÓïÑÔ³ÌʽÀïÃæ£º 
  
         ÔÚ C µÄ³Ìʽ¿âÀïÃæÒ»ÑùûÓУ¨¾ßÓпÉЯÐÔ£©µÄº¯Êý¿ÉÒÔÕÒ³ö³ÌʽÃû³ÆÓë 
         process IDs¡£ 
  
         È»¶øÓÐЩ³§ÉÌÌṩº¯ÊýÈÃÄúÄܶÁÈ¡ Kernel µÄ¼ÇÒäÌ壬ÀýÈç Sun ÌṩÁË 
         kvm_ ¿ªÍ·µÄº¯Êý£¬Data General ÔòÌṩÁË dg_ ¿ªÍ·µÄº¯Êý¡£Èç¹ûÄúµÄϵ 
         Í³¹ÜÀíԱδÏÞ¶¨ Kernel ¼ÇÒäÌåµÄ¶ÁȡȨÁ¦µÄ»°£¨Ò»°ãÖ»ÓРsuper user »ò 
         kmem Èº×éÀïµÄÈËÔ±²ÅÄܶÁÈ¡ Kernel ¼ÇÒäÌ壩£¬Ò»°ãʹÓÃÕßÒ²¿ÉÒÔÀûÓÃÕâ 
         Ð©ÌØÊ⺯ÊýÀ´´ïµ½Ä¿µÄ¡£È»¶ø£¬ÕâЩº¯Êýͨ³£Ã»ÓÐÕýʽµÄÎļþ˵Ã÷£¬¾ÍËãÓР
         µÄ»°Ò²¶¼Ð´µÃ¼èÉîÄѶ®£¬ÉõÖÁ»áËæÖøÏµÍ³°æ±¾µÄ¸üжø¸Ä±ä¡£ 
  
         ÓÐЩ³§ÉÌ»áÌṩ /proc µµ°¸ÏµÍ³£¬´Ëµµ°¸ÏµÍ³´æÔڵķ½Ê½ÎªÒ»¸öÄÚº¬¶à¸öµµ 
         °¸µÄĿ¼¡£Ã¿¸öµµÃû¶¼ÊÇÒ»¸öÊý×Ö£¬¶ÔÓ¦ÓÚ process ID£¬Äú¿ÉÒÔ¿ªÆôÕâ¸öµµ 
         °¸²¢ÇÒ¶ÁÈ¡¹ØÓÚÕâ¸ö process µÄ×ÊѶ¡£ÔÙ´ÎÌáÐÑһϣ¬ÓÐʱºòÄú»áÒòΪ´æÈ¡ 
         È¨ÏÞµÄÏÞÖÆ¶øÎÞ·¨Ê¹ÓÃÕâЩ¹¦ÄÜ£¬¶øÇÒʹÓÃÕâЩ¹¦Äܵķ½Ê½Ò²ËæÖøÏµÍ³¶ø 
         ±ä¡£ 
  
         Èç¹ûÄúµÄ³§É̲¢Ã»ÓÐÌá¹©ÌØÊâµÄ³Ìʽ¿â»òÕß /proc À´´¦ÀíÕâЩÊ£¬µ«ÊÇÄúÓÖ 
         ÏëÒªÔÚ C ÀïÃæÍê³ÉÕâЩ¹¦ÄÜ£¬ÄÇôÄú¿ÉÄÜÒª×Ô¼ºÔÚKernel ¼ÇÒäÌåµ±ÖзÑÐÄ 
         ËÑѰ¡£Èç¹ûÄúÏë¿´¿´ÕâЩ¹¦ÄÜÔÚijЩϵͳÉÏÊÇÔõô×öµ½µÄ£¬¿ÉÒԲο¼ ofiles 
         µÄԭʼ³Ìʽ£¬Äú¿ÉÒÔ´Ó comp.source.sources.unix µÄÀúÄê¹éµµÎÄÕµ±ÖÐÈ¡ 
         µÃ¡££¨ÓÐÒ»¸ö³ÆÎª kstuff µÄÌ××°³ÌÊ½Ôø¾­ÔÚ 1991 ÄêÎåÔ·¢±íÓÚ 
         alt.sources£¬Ëü¿ÉÒÔ°ïÄúÔÚ kernel µ±ÖÐËÑѰÓÐÓõÄ×ÊѶ£¬Äú¿ÉÒÔµ½ 
         wuarchive.wustl.edu ÀûÓÃÄäÃû ftp È¡»Ø 
         usenet/alt.sources/articles/{329{6,7,8,9},330{0,1}}.Z¡££© 
  
  
 3.11)   ÎÒÒªÔõÑù¾­ÓÉ rsh Ö´ÐÐÔ¶·½Ö¸Áîʱ£¬¼ì²éÔ¶·½Ö¸ÁîµÄ½áÊø×´Ì¬£¿ 
  
         ÒÔÏÂÖ¸ÁîÐÐÊÇÐв»Í¨µÄ£º 
  
                 rsh some-machine some-crummy-command || echo "Command failed" 
  
         Èç¹û rsh ³Ìʽ±¾ÉíÄܳɹ¦µØÖ´ÐУ¬ÄÇô rsh ³ÌʽµÄ½áÊø×´Ì¬¾ÍÊÇ 0£¬µ«Õâ 
         Ò²Ðí²»ÊÇÄúÕæÕýÏëÒªµÄ½á¹û¡£ 
         Èç¹ûÄúÏë¼ì²éÔ¶·½³ÌʽµÄÖ´ÐÐ״̬£¬Äú¿ÉÒÔÊÔÊÔMaarten Litmaath ÓÚ 1994 
         ÄêÊ®ÔÂÔÚ alt.sources·¢±íµÄ "ersh" script£¬ersh ÊÇÒ»¸öºô½Ð rsh µÄ shell 
         script£¬Ëü»á°²ÅÅÔ¶·½µÄ»úÆ÷»ØÓ¦Ô¶·½Ö¸ÁîµÄ½áÊø×´Ì¬£¬²¢´«»Ø´Ë½áÊø×´Ì¬¡£ 
  
  
 3.12)   Äܲ»ÄܰѠshell ±äÊý´«½ø awk ³Ìʽµ±ÖÐÄØ£¿ 
  
         Õâ¸öÎÊÌâÓÐÁ½¸ö¿ÉÐеķ½·¨£¬µÚÒ»¸ö·½·¨Ö»ÊǰѳÌʽµ±ÖÐÐèÒªÓõ½´Ë±äÊýµÄ 
         µØ·½Ö±½ÓÕ¹¿ª£¬ÀýÈçÒªµÃÖªÄúĿǰʹÓÃÄÄЩ tty£¬¿ÉÒÔʹÓ㺠
  
         who | awk '/^'"$USER"'/ { print $2 }'                           (1) 
  
         awk ³ÌʽµÄ³Ìʽͨ³£»áÓõ¥ÒýºÅÀ¨ÆðÀ´£¬ÒòΪ awk ³ÌʽÀïÃæ¾­³£»áÓõ½ $ 
         ×ÖÔª£¬Èç¹ûʹÓÃË«ÒýºÅµÄ»°£¬shell ±¾Éí»á½âÊÍÕâ¸ö×ÖÔª¡£ËùÒÔÀ²£¬ÔÚÕâÖÖ 
         ÌØÊâÇéÐÎÏ£¬ÎÒÃÇÏëÒª shell ½âÊÍ $USER µ±ÖеĠ$ ×ÖԪʱ£¬¾Í±ØÐèÏÈÓà
         µ¥ÒýºÅ°Ñǰ°ë¶ÎµÄ¾ä×ÓÔÝʱÀ¨ÆðÀ´£¬È»ºóÓÃË«ÒýºÅ°Ñ $USER À¨ÆðÀ´£¬ÔÙÓà
         µ¥ÒýºÅ°ÑËæºóµÄ¾ä×ÓÀ¨ÆðÀ´¡£Çë×¢Ò⣬˫ÒýºÅÔÚijЩ״¿öÏ¿ÉÒÔÂÔÈ¥²»Ð´£¬ 
         Ò²¾ÍÊÇ˵£¬¿ÉÒÔд³É£º 
  
         who | awk '/^'$USER'/ { print $2 }'                             (2) 
  
         È»¶ø£¬Èç¹û shell ±äÊýµÄÄÚÈݺ¬ÓÐÌØÊâ×ÖÔª»ò¿Õ°××ÖԪʱ£¬¾Í²»ÊÊÓÃÁË¡£ 
  
         µÚ¶þÖְѱäÊýµÄÉ趨´«½ø awk µÄ·½Ê½ÊÇÀûÓàawk µ±ÖÐÒ»¸öÎÞÎļþ˵Ã÷µÄ 
         ¹¦ÄÜ£¬ËüÔÊÐíÄú´ÓÃüÁîÁÐ͸¹ý¡¸¼ÙÔìµÄµµ°¸Ãû³Æ¡¹À´É趨±äÊý£¬ÀýÈ磺 
  
         who | awk '$1 == user { print $2 }' user="$USER" -              (3) 
  
         ÓÉÓÚÃüÁîÐÐÖеıäÊýÉ趨ÊÇÔÚ awk ÕæÕý´¦Àíµ½µÄʱºò²Å»áÉúЧ£¬Òò´ËÄú¿É 
         ÒÔÀûÓÃÕâÖÖ¼¼ÇÉÈàawk ÔÚÓöµ½²»Í¬µµÃûµÄʱºò×ö²»Í¬µÄ¶¯×÷¡£ÀýÈ磺 
  
         awk '{ program that depends on s }' s=1 file1 s=0 file2         (4) 
  
         Çë×¢ÒâÓÐЩ awk µÄ°æ±¾»áÔÚ BEGIN Çø¿éÖ´ÐÐ֮ǰ£¬¾ÍÈÃÕæÊµµµ°¸Ãû³ÆÖ® 
         Ç°ËùÐðÊöµÄ±äÊýÉ趨ÉúЧ£¬µ«ÓÐЩ²»»á£¬ËùÒÔÄú²»¿ÉÒÔÒÀÀµÆäÖÐÒ»ÖÖ¡£ 
  
         ÔÙ½øÒ»²½ÌáÐÑ£¬µ±ÄúÖ¸¶¨±äÊýµÄÉ趨ʱ£¬Èç¹ûûÓÐÖ¸¶¨ÕæÊµµÄµµ°¸Ãû³Æ£¬ 
         awk ½«²»»á×Ô¶¯´Ó±ê×¼ÊäÈë¶ÁÈ¡£¬ËùÒÔÄúÒªÔÚÃüÁîÖ®ºó¼ÓÉÏÒ»¸ö - ²ÎÊý£¬ 
         ¾Í¸ú (3) µÄÖ¸ÁîÐÐÄÚÈÝÒ»Ñù¡£ 
  
         µÚÈýÖÖ×ö·¨ÊÇʹÓýÏаæµÄawk (nawk)£¬Äú¿ÉÒÔÔÚ nawk µ±ÖÐÖ±½ÓÈ¡Óû· 
         ¾³±äÊý¡£ÀýÈ磺 
  
         nawk 'END { print "Your path variable is " ENVIRON["PATH"] }' /dev/null 
  
  
 3.13)   ÒªÔõÑù²ÅÄܱÜÃâÔÚ¼ÇÒäÌåÖÐÁôÏÂzombie processes£¿ 
  
         ºÜ²»Ðҵأ¬¶ÔÓÚËÀµôµÄ×Ó process Ó¦ÓеÄÐÐÎªÌØÐÔ²¢Ã»Óа취×öÒ»°ã»¯£¬Òò 
         ÎªÕâÐ©ÌØ¶¨/ÌØ¶¨µÄ»úÖÆ»áËæÖø Unix µÄÖÖÀ಻ͬ¶øÓÐËù²îÒì¡£ 
  
         Ê×ÏÈ£¬ÔÚ¸÷ÖÖ Unix ÉÏÃæÄú¶¼±ØÐèʹÓàwait() À´´¦Àí×Ó process¡£Ò²¾ÍÊÇ 
         Ëµ£¬ÎÒ»¹Ã»¿´¹ýÓÐÒ»ÖÖ Unix »á×Ô¶¯°Ñ½áÊøµÄ×Ó process ¸Éµô£¬¼´Ê¹Äú²»¸æ 
         ËßËü¸ÃÔõô×ö¡£ 
  
         Æä´Î£¬ÔÚijЩ´Ó SysV ÑÜÉúµÄϵͳµ±ÖУ¬Èç¹ûÄúÖ´ÐÐÁË signal(SIGCHLD, 
         SIG_IGN)"£¬£¨àÅ£¬ÊÂʵÉÏÓ¦¸ÃÊÇSIGCLD ¶ø·ÇSIGCHLD£¬µ«´ó¶àÊýгö 
         Â¯µÄ SysV ÏµÍ³¶¼»áÔÚ±íÍ·µµµ±ÖмÓÉÏ #define SIGCHLD SIGCLD£©£¬ÄÇ 
         Ã´×Ó processes ¶¼»á×Ô¶¯±»Çå³ýµÃǬǬ¾»¾»£¬Äúʲôʶ¼²»ÓÃ×ö¡£¿´¿´Õâ¸ö 
         ·½Ê½ÊÇ·ñ¿ÉÐеÄ×î¼Ñ×ö·¨¾ÍÊÇ×Ô¼ºÔÚ»úÆ÷ÉÏÊÔÊÔ¿´¡£Èç¹ûÄúÏëÊÔÖøÐ´³ö¾ß¿É 
         Ð¯ÐԵijÌʽÂ룬ÄÇôÒÀÀµÕâÖÖÌØÊâ´¦Àí·½Ê½¿ÉÄܲ»ÊǺÃÖ÷Òâ¡£²»ÐÒµÄÊÇ£¬ÔÚ 
         POSIX ²¢²»ÔÊÐíÄúÕâÑù×ö£»°Ñ SIGCHLD µÄÐÐªÌØÐÔÉè³É SIG_IGN ÔÚ 
         POSIX µ±Öв¢Ã»Óж¨Ò壬ËùÒÔÈç¹ûÄúÒªÈÃÄúµÄ³ÌʽºÏºõ POSIX µÄÒªÇó 
         Ê±£¬Äú¾Í²»¿ÉÒÔÕâÑù×ö¡£ 
  
         ÄÇôÔõÑù²ÅËãÊÇ POSIX µÄ×ö·¨ÄØ£¿ÈçÍ¬Ç°ÃæËùÊö£¬Äú±ØÐèÉ趨һ¸ö signal 
         µÄ´¦Àíº¯Êý£¬È»ºóÈÃËüÈ¥ wait¡£ÔÚ POSIX µ±ÖРsignal ´¦Àíº¯ÊýÊǾ­ÓÉ 
         sigaction É趨£¬ÓÉÓÚÄúÖ»¶ÔÖÕÖ¹µÄ×Ó process ¸ÐÐËȤ£¬¶ø²»ÊÇÄÇЩ stopped 
         µÄ×Ó process£¬ËùÒÔ¿ÉÒÔÔÚ sa_flags µ±ÖмÓÉÏ SA_NOCLDSTOP¡£Èç¹ûÒª 
         wait ×Ó process ¶ø±¾Éí²»Òò´Ë±»µ² (block)£¬¿ÉÒÔʹÓàwaitpid()¡£µÚÒ» 
         ¸ö²ÎÊý±ØÐèÊÇ -1 (´ú±í wait ÈκΠpid)£¬µÚÈý¸ö²ÎÊý±ØÐèÊÇ WNOHANG£¬ÕâÊÇ 
         ×î¾ß¿ÉЯÐÔµÄ×ö·¨£¬Ò²ÊÇ¿ÉÄÜ»á³ÉΪδÀ´×î¾ß¿ÉЯÐÔµÄд·¨¡£ 
  
         Èç¹ûÄúµÄϵͳ²»Ö§Ô® POSIX£¬ÄǾÍÓкܶà×ö·¨ÁË¡£×î¼òµ¥µÄ·½Ê½¾ÍÊÇÏÈÊÔ 
         ÊÔsignal(SIGCHLD, SIG_IGN) ÊÇ·ñ¿ÉÐУ¬¿ÉÒԵϰÄǾͺÃÁË¡£Èç¹û 
         SIG_IGN ÎÞ·¨ÓÃÀ´Ç¿ÖÆ×Ô¶¯ÊÕʰ²Ðº¡£¬ÄÇôÄú¾ÍÒª×Ô¼ºÐ´Ò»¸ö signal ´¦Àí 
         º¯ÊýÀ´ÊÕʰ²Ðº¡ÁË¡£ÒªÐ´³öÒ»¸öÊÊÓÃÓÚÿһÖÖ Unix µÄ singal ´¦Àíº¯ÊýÀ´ 
         ×öÕâ¼þÊÂÊDz»ÈÝÒ×µÄÊ£¬ÒòΪÓÐÏÂÁв»Ò»Öµĵط½£º 
 
         ÔÚһЩ Unix ÖУ¬Ò»¸ö»òÒ»¸öÒÔÉϵÄ×Ó process ËÀʱ£¬»áºô½Ð SIGCHLD µÄ 
         signal ´¦Àíº¯Êý¡£Ò²¾ÍÊÇ˵£¬Èç¹ûÄãµÄ signal ´¦Àíº¯ÊýÖ»ÓÐÒ»¸ö wait() 
         Ê±£¬²¢²»»á°ÑËùÓеÄ×Ó process ¶¼ÊÕʰǬ¾»¡£²»¹ý»¹ºÃ£¬ÎÒÏàÐÅÕâÀàµÄ 
         Unix ¶¼»áÓРwait3() »ò waitpid()£¬ÕâÁ½Õß¶¼ÓпÉÔÚ option ²ÎÊýÖÐʹÓà
         WNOHNAG ¿ÉÓÃÀ´¼ì²éÊÇ·ñÓÐ×Ó process ÉдýÊÕʰ¡£ËùÒÔÔÚÒ»¸öÓР
         wait3()/waitpid() µÄϵͳÖУ¬Äã¿ÉÒÔÒ»ÔÙÖØ¸´Ê¹Óàwait3()/waitpid() 
         ÒÔÈ·¶¨ËùÓеÄ×Ó process ¶¼ÒÑÊÕʰǬ¾»£×îºÃÊÇÓàwaitpid() ÒòΪ 
         ËüÔÚ POSIX ±ê×¼ÖС£ 
  
         ÔÚһЩ SysV-derived µÄϵͳÖУ¬ÔÙ SIGCHLD µÄ signal ´¦Àíº¯Êý½áÊøºó£¬ 
         Èô»¹ÓÐ×Ó process µÈ´ýÇå³ý£¬»¹ÊÇ»á²úÉú SIGCHLD signal¡£ Òò´Ë£¬Ôڴ󲿠
         ·ÝµÄ SysV ÏµÍ³ÖУ¬ÔÚ signal ´¦Àíº¯ÊýÀï¿ÉÒÔ¼ÙÉèÒª´¦ÀíµÄ signal Ö»ÓÐÒ» 
         ¸ö£¬ 
 
 

BBSˮľÇ廪վ¡Ã¾«»ªÇø