ʹÓÃShell½øÐй¤×÷µÄÈËÃǶÔUnix/LinuxϵÄShell±à³Ì¶¼ºÜÊìϤ£¬ÔÚËùÓеÄShell±à³ÌµÄÊéÖж¼»áÌáµ½#!/bin/bash,¶øÕâÀïµ½µ×°üº¬ÁËЩʲô£¿¶Ô²Ù×÷ϵͳ¶øÑÔ£¬ÕâÒ»ÐÐ×Ö·û´®Òâζ×Åʲô£¿Äã¿ÉÄÜ»á˵£¬²»¾ÍÊÇ»áÈÃ/bin/bash³ÌÐòÀ´½âÊÍÕâ¸ö½Å±¾³ÌÐòÂ𣿵±È»ÄãÊǶԵģ¬¿´¿´ÎÒÃǵıêÌ⣬ÕâÀïÎÒÃÇ̸̸½âÊÍÆ÷£¬ÈÃÎÒÃÇÒ»ÆðÀ´¿´¿´½Å±¾ÎļþÀïµÄµÚÒ»¾äµ½µ×¶Ôϵͳ¶øÑÔÒâζ×Åʲô¡£µ«ÓÐÒ»µãÎÒÃÇ¿ÉÏÈÃ÷ȷһϣ¬Ëùν½âÊÍÆ÷¾ÍÊÇÖ¸#!ÐкóÃæµÄ¿ÉÖ´ÐеijÌÐò¡£
Ò»¡¢ÎÒÃÇ´Óexec×庯Êý̸Æð
Èç¹ûÄã´Ó²»Ð´C³ÌÐò£¬¿ÉÄÜÐèÒª¶Ô±¾½ÚµÄÄÚÈÝ¿´µÃ¸üΪ×Ðϸ²¢ÇÒÊÔÑéһϡ£
´úÂë:
#include
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg , ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
exec×庯ÊýÒ»¹²ÓÐÉÏÃæËùÁеÄ5¸ö£¬×÷Óö¼ÊÇÒ»Ñù£ºÖ´ÐÐÒ»¶ÎеĴúÂë¡£Çø±ðÖ»ÊÇÏòº¯Êý´«µÝµÄ²ÎÊý·½Ê½²»Í¬¶øÒÑ£¬ÎÒÔÚÕâÀï½²½²execlº¯Êý£ºµÚÒ»¸ö²ÎÊý pathÊÇÖ¸ÏòÉèÖÃÁËÖ´ÐÐλÎļþµÄ·¾¶£¬ºóÃæµÄ¿É±ä²ÎÊýÁбí·Ö±ðÖ¸ÏòÁË´«µÝ¸ø´ËÖ´ÐÐÎļþµÄ²ÎÊýÁбí(°üÀ¨Á˲ÎÊý0,¼´ÊÇÖ´ÐÐÎļþµÄÃû³Æ)¡£×îºóÒ»¸ö²ÎÊýΪ (char *) 0£¬±íʾ²ÎÊýÁбí½áÊø¡£
¶ÔÓÚ½âÊÍÆ÷£¬exec×庯ÊýÊÇÕâÑù×öµÄ(ÒÔexeclΪÀý)£¬Èç¹ûpathÊÇÖ¸ÏòÁËÒ»¸ö½Å±¾£¬½Å±¾µÄµÚÒ»ÐÐÒÔ#!¿ªÍ·£¬ÔòÕâÑùµ÷Óãº
ÒÔ#!ºóÃæµÄ×Ö·û´®ÎªÃüÁºóÃæ¼ÓÉÏexecl²ÎÊýÁбíÖÐÖ¸¶¨µÄ²ÎÊýÁÐ±í£¬ÕâÑùÐγÉÁËеijÌÐòÖ´ÐС£
ÏÂÃæÎÒÃÇÒÔÀý×ÓÀ´ÑéÖ¤Õâ¸ö½á¹û£º
ÏÂÃæÕâ¸öC³ÌÐòµÄ×÷ÓÃÊÇ»ØÉäËùÓÐÃüÁîÐвÎÊý¡£
´úÂë:
/* Program source : showargs.c *
* Program name : showargs */
#include
int
main(int argc, char *argv[])
{
int i;
for(i = 0; i < argc; i++)
{
printf("arg[%d]: %s\n", i, argv[i]);
}
return 0;
}
thej ÓÚ 2005-11-23 12:02:39·¢±í:
±àÒ룺gcc -o showargs showargs.c
Ö´ÐУº
´úÂë:
$ pwd
/home/kiron
$ ./showargs arg1 arg2
arg[0]: ./showargs
arg[1]: arg1
arg[2]: arg2
ÎÒÃÇÔÚͬһ¸öĿ¼ÏÂÔÙдһ¸ö½Å±¾£º
´úÂë:
#!/home/kiron/showargs addargs
ÎÒûÓдò´í£¬Êǵģ¬Õâ¸ö½Å±¾¾ÍÖ»ÓÐÒ»ÐУ¬Õâ¸ö½Å±¾ÎÒÃÇÃüÃûΪtestexec£¬¼ÓÉÏÖ´ÐÐλºó£¬Ö´ÐÐÇé¿öÈçÏ£º
´úÂë:
$ ./testexec
arg[0]: /home/kiron/showargs
arg[1]: addargs
arg[2]: ./testexec
Ôõô»áÕâÑù£¿ÎҲ»áÓÐÈ˶ԵÚ2¸ö²ÎÊý./testexec²»Àí½â£¬ÔÝÇÒÂô¸ö¹Ø×Ó£¬ÔÙÒý³öÒ»¸öC³ÌÐò£º
´úÂë:
/* Program source : mytest.c *
* Program name : mytest */
#include
int
main(void)
{
execl("/home/kiron/testexec", "testexec", "arg1", "arg2", (char *) 0);
return 0;
}
±àÒ룺gcc -o mytest mytest.c
Ö´ÐУº
´úÂë:
$ ./mytest
arg[0]: /home/kiron/showargs
arg[1]: addargs
arg[2]: /home/kiron/testexec
arg[3]: arg1
arg[4]: arg2
×Ðϸ¹Û²ìÉÏÃæµÄÈý¸öÀý×Ó£¬´ð°¸¿ªÊ¼¸¡³öË®ÃæÁË¡£ÕýÈçÔÚ¿ªÊ¼Ê±½²µ½µÄ£¬exec×庯ÊýµÄ´¦ÀíÊÇ°Ñ#!ºóÃæµÄ×Ö·û´®ÎªÃüÁºóÃæ¼ÓÉÏexecl²ÎÊýÁбíÖÐÖ¸¶¨µÄ²ÎÊýÁÐ±í£¬ÕâÑùÐγÉÁËеijÌÐòÖ´ÐС£·ÖÎöÒ»ÏÂmytest.cÔ´³ÌÐò£¬execl°ÑÃüÁîµÄ½á¹ûÊÇÕâÑùÖ´ÐеÄ/home/kiron/testexecµÄÄÚÈÝÊÇ#!/home/kiron/showargs addargs£¬Ôò#!ºóÃæµÄ×Ö·û´®"/home/kiron/showargs addargs"¼ÓÉÏÃüÁî²ÎÊýÁÐ±í£º"/home/kiron/testexec arg1 arg2"¾ÍÐγÉÁËеijÌÐòÐУº/home/kiron/showargs addargs /home/kiron/testexec arg1 arg2¡£¶ÔÓÚtestexec½Å±¾£¬ÎÒÃÇÔÚshellÖе÷ÓÃËüʱ£¬shellµ÷ÓÃÁËfork,exec,waitÀ´Ö´ÐÐËü£¬Ò²¾ÍÊǺͳÌÐò mytest.cÒ»ÑùÓÃÁËexecº¯Êý£¬Ê×ÏÈ£¬execº¯Êý¶Ô#!ÐзÖÎöºóµÃ³ö´Ë½Å±¾µÄ½âÊÍÆ÷Ϊ/home/kiron/showargs£¬È»ºó¾ÍÐγÉÁË°ÑÃüÁîÐд¦Àí³ÉÁË£º¡°/home/kiron/showargs addargs ./testexec¡±¡£
×¢Ò⣺#!ÐÐÖеĽâÊÍÆ÷µÄ·¾¶±ØÐëÊÇȫ·¾¶£¬execº¯Êý²¢²»¶ÔÆäÌØÊâ´¦Àí£¬±ÈÈçÓÃPATH±äÁ¿À´ËÑË÷ËüµÄÕæʵ·¾¶£¬ËùÒÔ·¾¶ÊÇÓɳÌÐòÔ±À´±£Ö¤ÕýÈ·µÄ¡£
¶þ¡¢ÎҵĽű¾µÚÒ»¾ä±ØÐëµÃÊÇ#!/bin/bashÂð£¿
µ±È»²»±ØÁË£¬Í¨¹ýÉÏÃæµÄ½âÊÍ£¬ÆäʵµÚÒ»¾äµÄ#!ÊǶԽű¾µÄ½âÊÍÆ÷³ÌÐò·¾¶£¬½Å±¾µÄÄÚÈÝÊÇÓɽâÊÍÆ÷½âÊ͵ģ¬ÎÒÃÇ¿ÉÒÔÓø÷ÖÖ¸÷ÑùµÄ½âÊÍÆ÷À´Ð´¶ÔÓ¦µÄ½Å±¾£¬±ÈÈç˵/bin/csh½Å±¾£¬/bin/perl½Å±¾£¬/bin/awk½Å±¾£¬/bin/sed½Å±¾£¬ÉõÖÁ/bin/echoµÈµÈ¡£ÄÇÎÒÃÇÕæµÄÄÜдһ¸ö /bin/echoµÄ½Å±¾ÎļþÂð£¿ÎÒÃÇÀ´ÊÔÊÔ£¬ÏÂÃæÊÇÒ»¸öÀý×Ó£º
´úÂë:
#!/bin/echo -e
ÎÒ°ÑÕâÖ»ÓÐÒ»ÐеijÌÐò(ʵ¼ÊÉÏËüÒ²Ö»ÄÜÊÇÒ»ÐУ¬echo³ÌÐò²¢²»ÊDZ»Éè¼Æ³ÉÏñawkÄÇÑùµÄ±à³ÌÓïÑÔ£¬ÄÜд³ÉÔ´³ÌÐòÎļþ)ÃüÃûΪmyecho£¬¼ÓÉÏȨÏÞºóÖ´ÐÐËü£º
´úÂë:
$ ./myecho "hi\a"
./myecho hi
Èç¹ûÄãµÄechoÖ§³Ö-eÑ¡Ïî²¢ÇÒÄ㹤×÷µÄ»·¾³»¹Ëã°²¾²£¬ÄãÔڵõ½ÉÏÃæµÄ½á¹ûµÄʱºòÒ²Ó¦¸ÃÌýµ½Çå´àµÄÖÕ¶ËÏìÁå¡£µ«ÕâÖÖ³ÌÐòÊǺÁÎÞ×÷Óõġ£
Èý¡¢ÎÒÄÜÀûÓýâÊÍÆ÷À´×öʲô£¿
µ«ÊÇÉÏÃæµÄecho½Å±¾Êµ¼ÊÓ¦ÓÃʱ²¢Ã»ÓÐʲô×÷Óã¬ÎÒÃÇ¿ÉÒԵóöÒ»¸öССµÄʵÑé½á¹û£¬²¢²»ÊÇËùÓеĿÉÖ´Ðжþ½øÖÆÎļþ¶¼¿ÉÒÔÓÃÀ´Ð´½âÊÍÆ÷½Å±¾¡£ÄÇÎÒ±àд½âÊÍÆ÷µÄ½Å±¾ÓÐʲôÓã¿Èç¹ûÄãÓÐÒ»¸ö¿É±à³ÌµÄ½âÊÍÆ÷£¬ÄÇÄã»òÐíÄܱàд¸Ã½âÊÍÆ÷µÄ³ÌÐòÀ´¼ò»¯Ä㹤×÷¡£±ÈÈç˵³£Óõ½µÄ½âÊÍÆ÷Èçawk,perl,bashµÈµÈ¡£µ«ÊÇÕýÈçÎÒÃÇÉÏÃæ×ܽáµÄʵÑé½á¹û£¬ºÜ²»Ðҵأ¬²¢²»ÊÇÈ«²¿µÄ¿É±à³Ì³ÌÐò¶¼ÊÇÓÐÓõĽâÊÍÆ÷£¬exec½Å±¾Ê±£¬ÄÜ´ÓµÚÒ»Ðеõ½½Å±¾µÄ½âÊÍÆ÷£¬È»ºóÓÃexecÈ¥½âÊͽű¾(¿ÉÄÜÊÇÑ¡ÏîÈ¥¿ØÖÆ£¬Èç#!/bin/awk -f)£¬Ò²°üÀ¨ÁËÐÎÈç#!/PATH/µÄµÚÒ»ÐУ¬Èç¹û¸Ã½âÊÍÆ÷¶ÔÕâÐв»ÄܺöÂԵĻ°£¬¾Í»á³ö´í£¬ÁíÍâ½âÊÍÆ÷Ò²±ØÐëÒª¶ÔÓàϵijÌÐòÓï¾äÄܽâÊÍ(Õâ¾äºÃÏñÊÇ·Ï»°£¬µ«ÏëÏóһϣ¬ÉÏÃæmyecho³ÌÐò¼ÓһЩ"hello world"µÄÐÐÀ´£¬»áÓÐЧÂð£¿ÏÂÃæµÄmysed³ÌÐòÖеÄs/UNIX/unix/pÒ²ÊÇÒ»ÑùµÄµÀÀí)¡£Ïñawk,perl,bashµÈ³ÌÐò¶Ô#¿ªÍ·µÄÐе±³É×¢ÊÍÐд¦Àí£¬¾ÍÄÜд³ÉÓÐÓõĽű¾¡£
ÔÙ¿´ÏÂÃæµÄmysed³ÌÐò£¬
´úÂë:
#!/bin/sed -f
s/UNIX/unix/p
Ö´ÐÐ./mysedʱ³ö´íÁË¡£ÒòΪ±»½âÊͳÉÁË"/bin/sed -f ./mysed"£¬ÆäÖÐ-fÑ¡ÏîÊDZíʾÒÔÎļþÀïµÄÄÚÈÝ×÷ΪsedµÄÃüÁîÊäÈë,µ«sedµÄÃüÁîÊäÈë²»ÄܶÔ"#!/bin/sed -f"½âÊÍ£¬ÄÇô³ÌÐò³ö´íÁË¡£
ËùÒÔ£¬ÓÐÓõĽâÊÍÆ÷Ó¦¸ÃÊÇÀàËÆbash,perl,awkµÄ³ÌÐò£¬²¢ÇÒÄܶÔһЩ¹æ¶¨µÄÓï¾äÓнâÊ͹¦Äܵġ£ÏÂÃæ¸ø³öÒ»¸öawk³ÌÐòдµÄͳ¼ÆÎļþÐÐÊýºÍµ¥´ÊÊýµÄ½Å±¾³ÌÐòmyawk¡£
´úÂë:
#!/usr/bin/awk -f
BEGIN {
sum = 0;
}
{sum += NF;}
END {
printf("file \"%s\" have %d line, %d words.\n", FILENAME, NR, sum);
}
ÉèÖÃÖ´ÐÐλ֮ºó£¬Ö´ÐÐÈçÏ£º
´úÂë:
$ echo -e "hi\nhello world">test.txt
$ ./myawk test.txt
file "test.txt" have 2 line, 3 words
ÕâÀïÖ´ÐÐ./myawk±»Ö´Ðгɡ°/usr/bin/awk -f ./myawk test.txt¡±£¬ÒòΪawkµÄÃüÁîÖУ¬ÒÔ#¿ªÍ·µÄÐб»ÈÏΪÊÇ×¢ÊÍÐжøºöÂÔ£¬awkºöÂÔÁ˵ÚÒ»ÐÐ"#!/usr/bin/awk -f"£¬ÕýÈ·µÄÒÔ·Ç#¿ªÍ·Ðе±³ÉģʽºÍÃüÁîµÄÊäÈë²¢ÄܶÔÆä½âÊÍ£¬ËùÒÔÕâ¸ö³ÌÐòÊÇÕýÈ·µÄ£¬Äܱ»Ë³ÀûµØÖ´ÐС£