ǰÑÔ
±¾Îļ¯ÖнéÉÜÁËbash±à³ÌÖв¿·Ö¸ß¼¶±à³Ì·½·¨ºÍ¼¼ÇÉ¡£Í¨¹ýѧϰ±¾ÎÄÄÚÈÝ£¬¿ÉÒÔ°ïÄã½â¾öÒÔÏÂÎÊÌ⣺
1¡¢bash¿ÉÒÔÍøÂç±à³Ìô£¿
2¡¢.(){ .|.& };. ¾Ý˵ִÐÐÕâЩ·ûºÅ¿ÉÒÔËÀ»ú£¬ÄÇôËüÃÇÊÇɶÒâ˼£¿
3¡¢ÄãÊÇʲô±£Ö¤crondÖеÄÈÎÎñ²»Öظ´Ö´Ðеģ¿grepÒ»ÏÂÈ»ºówcËãһϸöÊýô£¿
4¡¢ÊÜÏÞģʽִÐÐbash¿ÉÒÔ±£»¤Ê²Ã´£¿
5¡¢É¶Ê±ºò»á³öÏÖsubshell£¿
6¡¢coprocнø³ÌÔõôÓã¿
/devºÍ/procĿ¼
devĿ¼ÊÇϵͳÖм¯ÖÐÓÃÀ´´æ·ÅÉ豸ÎļþµÄĿ¼¡£³ýÁËÉ豸ÎļþÒÔÍ⣬ϵͳÖÐÒ²Óв»ÉÙÌØÊâµÄ¹¦ÄÜͨ¹ýÉ豸µÄÐÎʽ±íÏÖ³öÀ´¡£É豸ÎļþÊÇÒ»ÖÖÌØÊâµÄÎļþ£¬ËüÃÇʵ¼ÊÉÏÊÇÇý¶¯³ÌÐòµÄ½Ó¿Ú¡£ÔÚLinux²Ù×÷ϵͳÖУ¬ºÜ¶àÉ豸¶¼ÊÇͨ¹ýÉ豸ÎļþµÄ·½Ê½Îª½ø³ÌÌṩÁËÊäÈë¡¢Êä³öµÄµ÷Óñê×¼£¬ÕâÒ²·ûºÏUNIXµÄ¡°Ò»ÇнÔÎļþ¡±µÄÉè¼ÆÔÔò¡£ËùÒÔ£¬¶ÔÓÚÉ豸ÎļþÀ´Ëµ£¬ÎļþÃûºÍ·¾¶Æäʵ¶¼²»ÖØÒª£¬×îÖØÒªµÄʹÆäÖ÷É豸ºÅºÍ¸¨ÖúÉ豸ºÅ£¬¾ÍÊÇÓÃls
-lÃüÁîÏÔʾ³öÀ´µÄÔ±¾Ó¦¸Ã³öÏÖÔÚÎļþ´óСλÖÃÉϵÄÁ½¸öÊý×Ö£¬±ÈÈçÏÂÃæÃüÁîÏÔʾµÄ8ºÍ0£º
[zorro@zorrozou-pc0 bash]$ ls -l /dev/sda brw-rw---- 1 root disk 8, 0 5ÔÂ 12 10:47 /dev/sda |
É豸ÎļþµÄÖ÷É豸ºÅ¶ÔÓ¦ÁËÕâÖÖÉ豸ËùʹÓõÄÇý¶¯ÊÇÄĸö£¬¶ø¸¨ÖúÉ豸ºÅÔò±íʾʹÓÃͬһÖÖÇý¶¯µÄÉ豸±àºÅ¡£ÎÒÃÇ¿ÉÒÔʹÓÃmknodÃüÁîÊÖ¶¯´´½¨Ò»¸öÉ豸Îļþ£º
[zorro@zorrozou-pc0 bash]$ sudo mknod harddisk b 8 0 [zorro@zorrozou-pc0 bash]$ ls -l harddisk brw-r--r-- 1 root root 8, 0 5ÔÂ 18 09:49 harddisks |
ÕâÑùÎÒÃǾʹ´½¨ÁËÒ»¸öÉ豸Îļþ½Ðharddisk£¬Êµ¼ÊÉÏËü¸ú/dev/sdaÊÇͬһ¸öÉ豸£¬ÒòΪËüÃǶÔÓ¦µÄÉ豸Çý¶¯ºÍ±àºÅ¶¼Ò»Ñù¡£ËùÒÔÕâ¸öÉ豸ʵ¼ÊÉÏÊǸúsdaÏàͬ¹¦ÄܵÄÉ豸¡£
ϵͳ»¹¸øÎÒÃÇÌṩÁ˼¸¸öÓÐÌØÊ⹦ÄܵÄÉ豸Îļþ£¬ÔÚbash±à³ÌµÄʱºò¿ÉÄܻᾳ£Óõ½£º
/dev/null£ººÚ¶´Îļþ¡£¿ÉÒÔ¶ÔËüÖØ¶¨ÏòÈçºÎÊä³ö¡£
/dev/zero£º0·¢ÉúÆ÷¡£¿ÉÒÔ²úÉú¶þ½øÖƵÄ0£¬²úÉú¶àÉÙ¸ùʹÓÃʱ¼ä³¤¶ÈÓйء£ÎÒÃǾ³£ÓÃÕâ¸öÎļþÀ´²úÉú´óÎļþ½øÐÐijЩ²âÊÔ£¬È磺
[zorro@zorrozou-pc0 bash]$ dd if=/dev/zero of=./bigfile bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.3501 s, 3.1 GB/s |
ddÃüÁîÒ²ÊÇÎÒÃÇÔÚbash±à³ÌÖпÉÄܻᾳ£Ê¹Óõ½µÄÃüÁî¡£
/dev/random£ºLinuxϵÄrandomÎļþÊÇÒ»¸ö¸ù¾Ý¼ÆËã»ú±³¾°ÔëÉù¶ø²úÉúËæ»úÊýµÄÕæËæ»úÊý·¢ÉúÆ÷¡£ËùÒÔ£¬Èç¹ûÈÝÄÉÔëÉùÊý¾ÝµÄìØ³Ø¿ÕÁË£¬ÄÇô¶ÔÎļþµÄ¶ÁÈ¡»á³öÏÖ×èÈû¡£
/dev/urandom£ºÊÇÒ»¸öÎ±Ëæ»úÊý·¢ÉúÆ÷¡£Êµ¼ÊÉÏÔÚLinuxµÄÊÓÏßÖУ¬urandom²úÉúËæ»úÊýµÄ·½·¨¸ùrandomÒ»Ñù£¬Ö»ÊÇËü¿ÉÒÔÖØ¸´Ê¹ÓÃìØ³ØÖеÄÊý¾Ý¡£ÕâÁ½¸öÎļþÔÚ²»Í¬µÄÀàunixϵͳÖпÉÄÜʵÏÖ·½·¨²»Í¬£¬Çë×¢ÒâËüÃǵÄÇø±ð¡£
/dev/tcp & /dev/udp£ºÕâÁ½¸öÉñÆæµÄĿ¼Ϊbash±à³ÌÌṩÁËÒ»ÖÖ¿ÉÒÔ½øÐÐÍøÂç±à³ÌµÄ¹¦ÄÜ¡£ÔÚbash³ÌÐòÖÐʹÓÃ/dev/tcp/ip/portµÄ·½Ê½¾Í¿ÉÒÔ´´½¨Ò»¸öscoket×÷Ϊ¿Í»§¶ËÈ¥Á¬½Ó·þÎñ¶ËµÄip:port¡£ÎÒÃÇÓÃÒ»¸ö¼ì²éhttpÐÒéµÄ80¶Ë¿ÚÊÇ·ñ´ò¿ªµÄÀý×ÓÀ´ËµÃ÷ËüµÄʹÓ÷½·¨£º
[zorro@zorrozou-pc0 bash]$ cat tcp.sh #!/bin/bash
ipaddr=127.0.0.1
port=80
if ! exec 5<> /dev/tcp/$ipaddr/$port
then
exit 1
fi
echo -e "GET / HTTP/1.0\n" >&5
cat <&5 |
ipaddrµÄ²¿·Ö»¹¿ÉÒÔдһ¸öÖ÷»úÃû¡£´ó¼Ò¿ÉÒÔÓô˽ű¾·Ö±ðÔÚ±¾»ú´ò¿ªweb·þÎñºÍ²»´ò¿ªµÄÇé¿öÏ·ֱðÖ´Ðй۲ìÊÇʲôЧ¹û¡£
/procÊÇÁíÒ»¸öÎÒÃǾ³£Ê¹ÓõÄĿ¼¡£Õâ¸öĿ¼ÍêÈ«ÊÇÄÚºËÐéÄâµÄ¡£Äں˽«Ò»Ð©ÏµÍ³ÐÅÏ¢¶¼·ÅÔÚ/procĿ¼ÏÂÒ»ÎļþºÍÎı¾µÄ·½Ê½ÏÔʾ³öÀ´£¬È磺/proc/cpuinfo¡¢/proc/meminfo¡£ÎÒÃÇ¿ÉÒÔʹÓÃman
5 procÀ´²éѯÕâ¸öĿ¼ÏÂÎļþµÄ×÷Óá£
º¯ÊýºÍµÝ¹é
ÎÒÃÇÒѾ½Ó´¥¹ýº¯ÊýµÄ¸ÅÄîÁË£¬ÔÚbash±à³ÌÖУ¬º¯ÊýÎÞ·ÇÊǽ«Ò»´®ÃüÁîÆðÁ˸öÃû×Ö£¬ºóÐøÏëÒªµ÷ÓÃÕâÒ»´®ÃüÁî¾Í¿ÉÒÔÖ±½Óдº¯ÊýµÄÃû×ÖÁË¡£ÔÚÓï·¨É϶¨ÒåÒ»¸öº¯ÊýµÄ·½·¨ÊÇ£º
name () compound-command [redirection] function name [()] compound-command [redirection] |
ÎÒÃÇ¿ÉÒÔ¼Ófunction¹Ø¼ü×ÖÏÔʽµÄ¶¨ÒåÒ»¸öº¯Êý£¬Ò²¿ÉÒÔ²»¼Ó¡£º¯ÊýÔÚ¶¨ÒåµÄʱºò¿ÉÒÔÖ±½ÓÔÚºóÃæ¼ÓÉÏÖØ¶¨ÏòµÄ´¦Àí¡£ÕâÀﻹÐèÒªÌØÊâ˵Ã÷µÄÊǺ¯ÊýµÄ²ÎÊý´¦ÀíºÍ¾Ö²¿±äÁ¿£¬Çë¿´ÏÂÃæ½Å±¾£º
[zorro@zorrozou-pc0 bash]$ cat function.sh |awk '{print "\t"$0}' #!/bin/bash
aaa=1000
arg_proc () {
echo "Function begin:"
local aaa=2000
echo $1
echo $2
echo $3
echo $*
echo $@
echo $aaa
echo "Function end!"
}
echo "Script bugin:"
echo $1
echo $2
echo $3
echo $*
echo $@
echo $aaa
arg_proc aaa bbb ccc ddd eee fff
echo $1
echo $2
echo $3
echo $*
echo $@
echo $aaa
echo "Script end!" |
ÎÒÃÇ´ø-x²ÎÊýÖ´ÐÐһϣº
+ aaa=1000 + echo 'Script bugin:' Script bugin: + echo 111 111 + echo 222 222 + echo 333 333 + echo 111 222 333 444 555 111 222 333 444 555 + echo 111 222 333 444 555 111 222 333 444 555 + echo 1000 1000 + arg_proc aaa bbb ccc ddd eee fff + echo 'Function begin:' Function begin: + local aaa=2000 + echo aaa aaa + echo bbb bbb + echo ccc ccc + echo aaa bbb ccc ddd eee fff aaa bbb ccc ddd eee fff + echo aaa bbb ccc ddd eee fff aaa bbb ccc ddd eee fff + echo 2000 2000 + echo 'Function end!' Function end! + echo 111 111 + echo 222 222 + echo 333 333 + echo 111 222 333 444 555 111 222 333 444 555 + echo 111 222 333 444 555 111 222 333 444 555 + echo 1000 1000 + echo 'Script end!' Script end! |
¹Û²ìÕû¸öÖ´Ðйý³Ì¿ÉÒÔ·¢ÏÖ£¬º¯ÊýµÄ²ÎÊýÊÊÓ÷½·¨¸ú½Å±¾Ò»Ñù£¬¶¼¿ÉÒÔʹÓÃ*¡¢$@ÕâЩ·ûºÅÀ´´¦Àí¡£¶øÇÒº¯Êý²ÎÊý¸úº¯ÊýÄÚ²¿Ê¹ÓÃlocal¶¨ÒåµÄ¾Ö²¿±äÁ¿Ð§¹ûÒ»Ñù£¬¶¼ÊÇÖ»ÔÚº¯ÊýÄÚ²¿ÄÜ¿´µ½¡£º¯ÊýÍⲿ¿´²»µ½º¯ÊýÀﶨÒåµÄ¾Ö²¿±äÁ¿£¬µ±º¯ÊýÄÚ²¿µÄ¾Ö²¿±äÁ¿ºÍÍⲿµÄÈ«¾Ö±äÁ¿Ãû×ÖÏàͬʱ£¬º¯ÊýÄÚÖ»ÄÜÈ¡µ½¾Ö²¿±äÁ¿µÄÖµ¡£µ±º¯ÊýÄÚ²¿Ã»Óж¨Òå¸úÍⲿͬÃûµÄ¾Ö²¿±äÁ¿µÄʱºò£¬º¯ÊýÄÚ²¿Ò²¿ÉÒÔ¿´µ½È«¾Ö±äÁ¿¡£
bash±à³ÌÖ§³ÖµÝ¹éµ÷Óú¯Êý£¬¸úÆäËû±à³ÌÓïÑÔ²»Í¬µÄµØ·½ÊÇ£¬bash»¹¿ÉÒԵݹéµÄµ÷ÓÃ×ÔÉí£¬ÕâÔÚijЩ±à³Ì³¡¾°Ï·dz£ÓÐÓá£ÎÒÃÇÏÈÀ´¿´Ò»¸öµÝ¹éµÄ¼òµ¥Àý×Ó£º
[zorro@zorrozou-pc0 bash]$ cat recurse.sh #!/bin/bash
read_dir () {
for i in $1/*
do
if [ -d $i ]
then
read_dir $i
else
echo $i
fi
done
}
read_dir $1 |
Õâ¸ö½Å±¾¿ÉÒÔ±éÀúÒ»¸öĿ¼ÏÂËùÓÐ×ÓĿ¼ÖеķÇĿ¼Îļþ¡£¹ØÓڵݹ飬»¹ÓÐÒ»¸ö¾µäµÄÀý×Ó£¬forkÕ¨µ¯£º
ÕâÒ»¶Ñ·ûºÅ¿´ÉÏÈ¥ºÜÁîÈ˷ѽ⣬ÎÒÃÇÀ´½âÊÍÒ»ÏÂÿ¸ö·ûºÅµÄº¬Ò壺¸ù¾Ýº¯ÊýµÄ¶¨ÒåÓï·¨£¬ÎÒÃÇÖªµÀ.(){}µÄÒâ˼ÊÇ£¬¶¨ÒåÒ»¸öº¯ÊýÃû×ӽС°.¡±¡£ËäȻϵͳÖÐÓÖ¸öÄÚ½¨ÃüÁîÒ²½Ð.£¬¾ÍÊÇsourceÃüÁµ«ÊÇÎÒÃÇÒ²ÖªµÀ£¬µ±º¯ÊýºÍÄÚ½¨ÃüÁîÃû×Ö³åÍ»µÄʱºò£¬bashÊ×ÏȻὫÃû×Öµ±³ÉÊǺ¯ÊýÀ´½âÊÍ¡£ÔÚ{}°üº¬µÄº¯ÊýÌåÖУ¬Ê¹ÓÃÁËÒ»¸ö¹ÜµÀÁ¬½ÓÁËÁ½¸öµã£¬ÕâÀïµÄµÚÒ»¸ö.¾ÍÊǺ¯ÊýµÄµÝ¹éµ÷Óã¬ÎÒÃÇÒ²ÖªµÀÁËʹÓùܵÀµÄʱºò»á´ò¿ªÒ»¸ösubshellµÄ×Ó½ø³Ì£¬ËùÒÔÔÚÕâÀïÃæ¾ÍµÝ¹éµÄ´ò¿ªÁË×Ó½ø³Ì¡£{}ºóÃæµÄ·ÖºÅÖ»±íʾº¯Êý¶¨ÒåÍê±ÏµÄ½áÊø·û£¬ÔÚÖ®ºó¾ÍÊǵ÷Óú¯ÊýÃûÖ´ÐеÄ.£¬Ö®ºóº¯Êý¿ªÊ¼µÝ¹éµÄ´ò¿ª×Ô¼º£¬È¥²úÉú×Ó½ø³Ì£¬Ö±µ½ÏµÍ³±ÀÀ£ÎªÖ¹¡£
bash²¢·¢±à³ÌºÍflock
ÔÚshell±à³ÌÖУ¬ÐèҪʹÓò¢·¢±à³ÌµÄ³¡¾°²¢²»¶à¡£ÎÒÃǵ¹ÊǾ³£»áÏëҪij¸ö½Å±¾²»ÒªÍ¬Ê±³öÏÖ¶à´ÎͬʱִÐУ¬±ÈÈç·ÅÔÚcrondÖеÄij¸öÖÜÆÚÈÎÎñ£¬Èç¹ûÖ´ÐÐʱ¼ä½Ï³¤ÒÔÖÁÓÚÏ´ÎÔÙµ÷¶ÈµÄʱ¼ä¼ä¸ô£¬ÄÇôÉÏÒ»¸ö»¹Ã»Ö´ÐÐÍê¾Í¿ÉÄÜÓÖ´ò¿ªÒ»¸ö£¬ÕâʱÎÒÃÇ»áÏ£Íû±¾´Î²»ÓÃÖ´ÐС£±¾ÖÊÉϽ²£¬ÎÞÂÛÊÇÖ»±£Ö¤ÈκÎʱºòϵͳÖÐÖ»³öÏÖÒ»¸ö½ø³Ì»¹ÊǶà¸ö½ø³Ì²¢·¢£¬ÎÒÃÇÐèÒª¶Ô½ø³Ì½øÐÐÀàËÆµÄ¿ØÖÆ¡£ÒòΪ²¢·¢µÄʱºòÒ²»áÓпÉÄܲúÉú¾ºÕùÌõ¼þ£¬µ¼Ö³ÌÐò³öÎÊÌâ¡£
ÎÒÃÇÏÈÀ´¿´ÈçºÎдһ¸ö²¢·¢µÄbash³ÌÐò¡£ÔÚǰÎĽ²µ½×÷Òµ¿ØÖƺÍwaitÃüÁîʹÓõÄʱºò£¬ÎÒÃǾÍÒѾдÁËÒ»¸ö¼òµ¥µÄ²¢·¢³ÌÐòÁË£¬ÎÒÃÇÕâ´ÎÈÃËü±äµÃ¸´ÔÓÒ»µã¡£ÎÒÃÇдһ¸öbash½Å±¾£¬´´½¨Ò»¸ö¼ÆÊýÎļþ£¬²¢½«ÀïÃæµÄֵдΪ0¡£È»ºó´ò¿ª100¸ö×Ó½ø³Ì£¬Ã¿¸ö½ø³Ì¶¼È¥¶ÁÈ¡Õâ¸ö¼ÆÊýÎļþµÄµ±Ç°Öµ£¬²¢¼Ó1д»ØÈ¥¡£Èç¹û³ÌÐòÖ´ÐÐÕýÈ·£¬×îºóÀïÃæµÄÖµÓ¦¸ÃÊÇ100£¬ÒòΪÿ¸ö×Ó½ø³Ì¶¼»áÀÛ¼ÓÒ»¸ö1дÈëÎļþ£¬ÎÒÃÇÀ´ÊÔÊÔ£º
[zorro@zorrozou-pc0 bash]$ cat racing.sh #!/bin/bash
countfile=/tmp/count
if ! [ -f $countfile ]
then
echo 0 > $countfile
fi
do_count () {
read count < $countfile
echo $((++count)) > $countfile
}
for i in `seq 1 100`
do
do_count &
done
wait
cat $countfile
rm $countfile |
ÎÒÃÇÔÙÀ´¿´¿´Õâ¸ö³ÌÐòµÄÖ´Ðнá¹û£º
[zorro@zorrozou-pc0 bash]$ ./racing.sh 26 [zorro@zorrozou-pc0 bash]$ ./racing.sh 13 [zorro@zorrozou-pc0 bash]$ ./racing.sh 34 [zorro@zorrozou-pc0 bash]$ ./racing.sh 25 [zorro@zorrozou-pc0 bash]$ ./racing.sh 45 [zorro@zorrozou-pc0 bash]$ ./racing.sh 5 |
¶à´ÎÖ´ÐÐÖ®ºó£¬Ã¿´ÎµÃµ½µÄ½á¹û¶¼²»Ò»Ñù£¬Ò²Ã»ÓÐÒ»´ÎÊÇÕýÈ·µÄ½á¹û¡£Õâ¾ÍÊǵäÐ͵ľºÕùÌõ¼þÒýÆðµÄÎÊÌâ¡£µ±¶à¸ö½ø³Ì²¢·¢µÄʱºò£¬Èç¹ûʹÓõĹ²ÏíµÄ×ÊÔ´£¬¾ÍÓпÉÄÜ»áÔì³ÉÕâÑùµÄÎÊÌâ¡£ÕâÀïµÄ¾ºÕùµ÷½Ì¾ÍÊÇ£ºµ±Ä³Ò»¸ö½ø³Ì¶Á³öÎļþֵΪ0£¬²¢¼Ó1£¬»¹Ã»Ð´»ØÈ¥µÄʱºò£¬Èç¹ûÓбðµÄ½ø³Ì¶ÁÁËÎļþ£¬¶Áµ½µÄ»¹ÊÇ0¡£ÓÚÊǶà¸ö½ø³Ì»áд1£¬ÒÔ¼°ÆäËüµÄÊý×Ö¡£½â¾ö¹²ÏíÎļþµÄ¾ºÕùÎÊÌâµÄ°ì·¨ÊÇʹÓÃÎļþËø¡£Ã¿¸ö×Ó½ø³ÌÔÚ¶ÁÈ¡Îļþ֮ǰÏȸøÎļþ¼ÓËø£¬Ð´ÈëÖ®ºó½âËø£¬ÕâÑùÁÙ½çÇø´úÂë¾Í¿ÉÒÔ»¥³âÖ´ÐÐÁË£º
[zorro@zorrozou-pc0 bash]$ cat flock.sh #!/bin/bash
countfile=/tmp/count
if ! [ -f $countfile ]
then
echo 0 > $countfile
fi
do_count () {
exec 3< $countfile
#¶ÔÈýºÅÃèÊö·û¼Ó»¥³âËø
flock -x 3
read -u 3 count
echo $((++count)) > $countfile
#½âËø
flock -u 3
#¹Ø±ÕÃèÊö·ûÒ²»á½âËø
exec 3>&-
}
for i in `seq 1 100`
do
do_count &
done
wait
cat $countfile
rm $countfile
[zorro@zorrozou-pc0 bash]$ ./flock.sh
100 |
¶ÔÁÙ½çÇø´úÂë½øÐмÓËø´¦ÀíÖ®ºó£¬³ÌÐòÖ´Ðнá¹ûÕýÈ·ÁË¡£×Ðϸ˼¿¼Ò»Ï³ÌÐòÖ®ºó¾Í»á·¢ÏÖ£¬ÕâÀïËùνµÄÁÙ½çÇø´úÂëÓɼÓËøÇ°µÄ²¢ÐУ¬±ä³ÉÁ˼ÓËøºóµÄ´®ÐС£flockµÄĬÈÏÐÐΪÊÇ£¬Èç¹ûÎļþ֮ǰû±»¼ÓËø£¬Ôò¼ÓËø³É¹¦·µ»Ø£¬Èç¹ûÒѾÓÐÈ˳ÖÓÐËø£¬Ôò¼ÓËøÐÐΪ»á×èÈû£¬Ö±µ½³É¹¦¼ÓËø¡£ËùÒÔ£¬ÎÒÃÇÒ²¿ÉÒÔÀûÓû¥³âËøµÄÕâ¸öÌØÕ÷£¬ÈÃbash½Å±¾²»»áÖØ¸´Ö´ÐС£
[zorro@zorrozou-pc0 bash]$ cat repeat.sh #!/bin/bash
exec 3> /tmp/.lock
if ! flock -xn 3
then
echo "already running!"
exit 1
fi
echo "running!"
sleep 30
echo "ending"
flock -u 3
exec 3>&-
rm /tmp/.lock
exit 0 |
-n²ÎÊý¿ÉÒÔÈÃflockÃüÁîÒÔ·Ç×èÈû·½Ê½Ì½²âÒ»¸öÎļþÊÇ·ñÒѾ±»¼ÓËø£¬ËùÒÔ¿ÉÒÔʹÓû¥³âËøµÄÌØµã±£Ö¤½Å±¾ÔËÐеÄΨһÐÔ¡£½Å±¾Í˳öµÄʱºòËø»á±»ÊÍ·Å£¬ËùÒÔÕâÀï¿ÉÒÔ²»ÓÃÏÔʽµÄʹÓÃflock½âËø¡£flock³ýÁË-u²ÎÊýÖ¸¶¨ÎļþÃèÊö·ûËøÎļþÒÔÍ⣬»¹¿ÉÒÔ×÷ΪִÐÐÃüÁîµÄǰ׺ʹÓá£ÕâÖÖ·½Ê½·Ç³£ÊʺÏÖ±½ÓÔÚcrondÖз½Ê½ËùÒªÖ´ÐеĽű¾Öظ´Ö´ÐС£È磺
*/1 * * * * /usr/bin/flock -xn /tmp/script.lock -c '/home/bash/script.sh' |
¹ØÓÚflockµÄÆäËü²ÎÊý£¬¿ÉÒÔman flockÕÒµ½ËµÃ÷¡£
ÊÜÏÞbash
ÒÔÊÜÏÞģʽִÐÐbash³ÌÐò£¬ÓÐʱºòÊǺÜÓбØÒªµÄ¡£ÕâÖÖģʽ¿ÉÒÔ±£»¤ÎÒÃǵĺܶàϵͳ»·¾³²»ÊÜbash³ÌÐòµÄÎó²Ù×÷Ó°Ïì¡£Æô¶¯ÊÜÏÞģʽµÄbashµÄ·½·¨ÊÇʹÓÃ-r²ÎÊý£¬»òÕßÒ²¿ÉÒÔrbashµÄ½ø³ÌÃû·½Ê½Ö´ÐÐbash¡£ÊÜÏÞģʽµÄbashºÍÕý³£bashʱ¼äµÄ²î±ðÊÇ£º
1¡¢²»ÄÜʹÓÃcdÃüÁî¸Ä±äµ±Ç°¹¤×÷Ŀ¼¡£
2¡¢²»ÄܸıäSHELL¡¢PATH¡¢ENVºÍBASH_ENV»·¾³±äÁ¿¡£
3¡¢²»Äܵ÷Óú¬ÓÐ/µÄÃüÁî·¾¶¡£
4¡¢²»ÄÜʹÓÃ.Ö´ÐдøÓÐ/×Ö·ûµÄÃüÁî·¾¶¡£
5¡¢²»ÄÜʹÓÃhashÃüÁîµÄ-p²ÎÊýÖ¸¶¨Ò»¸ö´øÐ±¸Ü\µÄ²ÎÊý¡£
6¡¢²»ÄÜÔÚshell»·¾³Æô¶¯µÄʱºò¼ÓÔØº¯ÊýµÄ¶¨Òå¡£
7¡¢²»Äܼì²éSHELLOPTS±äÁ¿µÄÄÚÈÝ¡£
8¡¢²»ÄÜʹÓÃ>, >|, <>, >&, &>ºÍ >>ÖØ¶¨Ïò²Ù×÷·û¡£
9¡¢²»ÄÜʹÓÃexecÃüÁîʹÓÃÒ»¸öгÌÐòÌæ»»µ±Ç°Ö´ÐеÄbash½ø³Ì¡£
10¡¢enableÄÚ½¨ÃüÁî²»ÄÜʹÓÃ-f¡¢-d²ÎÊý¡£
11¡¢²»¿ÉÒÔʹÓÃenableÃüÁî´ò¿ª»òÕ߹رÕÄÚ½¨ÃüÁî¡£
12¡¢commandÃüÁî²»¿ÉÒÔʹÓÃ-p²ÎÊý¡£
13¡¢²»ÄÜʹÓÃset +r»òÕßset +o restrictedÃüÁî¹Ø±ÕÊÜÏÞģʽ¡£
²âÊÔÒ»¸ö¼òµ¥µÄÊÜÏÞģʽ£º
[zorro@zorrozou-pc0 bash]$ cat restricted.sh #!/bin/bash
set -r
cd /tmp
[zorro@zorrozou-pc0 bash]$ ./restricted.sh
./restricted.sh: line 5: cd: restricted |
subshell
ÎÒÃÇÇ°Ãæ½Ó´¥¹ýsubshellµÄ¸ÅÄÎÒÃÇ֮ǰ˵µÄÊÇ£¬µ±Ò»¸öÃüÁî·ÅÔÚ()ÖеÄʱºò£¬bash»á´ò¿ªÒ»¸ö×Ó½ø³ÌÈ¥Ö´ÐÐÏà¹ØÃüÁÕâ¸ö×Ó½ø³Ìʵ¼ÊÉÏÊÇÁíÒ»¸öbash»·¾³£¬½Ð×ösubshell¡£µ±È»°üÀ¨·ÅÔÚ()ÖÐÖ´ÐеÄÃüÁbash»áÔÚÒÔÏÂÇé¿öÏ´ò¿ªÒ»¸ösubshellÖ´ÐÐÃüÁ
1¡¢Ê¹ÓÃ&×÷ΪÃüÁî½áÊøÌá½»ÁË×÷Òµ¿ØÖÆÈÎÎñʱ¡£
2¡¢Ê¹ÓÃ|Á¬½ÓµÄÃüÁî»áÔÚsubshellÖдò¿ª¡£
3¡¢Ê¹ÓÃ()·â×°µÄÃüÁî¡£
4¡¢Ê¹ÓÃcoproc£¨bash 4.0°æ±¾Ö®ºóÖ§³Ö£©×÷Ϊǰ׺ִÐеÄÃüÁî¡£
5¡¢ÒªÖ´ÐеÄÎļþ²»´æÔÚ»òÕßÎļþ´æÔÚµ«²»¾ß±¸¿ÉÖ´ÐÐȨÏÞµÄʱºò£¬Õâ¸öÖ´Ðйý³Ì»á´ò¿ªÒ»¸ösubshellÖ´ÐС£
ÔÚsubshellÖУ¬ÓÐЩÊÂÇéÐèҪעÒâ¡£subshellÖеÄ$$È¡µ½µÄÈÔÈ»ÊǸ¸½ø³ÌbashµÄpid£¬Èç¹ûÏëҪȡµ½subshellµÄpid£¬¿ÉÒÔʹÓÃBASHPID±äÁ¿£º
[zorro@zorrozou-pc0 bash]$ echo $$ ;echo $BASHPID && (echo $$;echo $BASHPID) 5484 5484 5484 24584 |
¿ÉÒÔʹÓÃBASH_SUBSHELL±äÁ¿µÄÖµÀ´¼ì²éµ±Ç°»·¾³ÊDz»ÊÇÔÚsubshellÖУ¬Õâ¸öÖµÔÚ·ÇsubshellÖÐÊÇ0£»Ã¿½øÈëÒ»²ãsubshell¾Í¼Ó1¡£
[zorro@zorrozou-pc0 bash]$ echo $BASH_SUBSHELL; (echo $BASH_SUBSHELL;(echo $BASH_SUBSHELL)) 0 1 2 |
ÔÚsubshellÖÐ×öµÄÈκβÙ×÷¶¼²»»áÓ°Ï츸½ø³ÌµÄbashÖ´Ðл·¾³¡£subshell³ýÁËPIDºÍtrapÏà¹ØÉèÖÃÍ⣬ÆäËûµÄ»·¾³¶¼¸ú¸¸½ø³ÌÊÇÒ»ÑùµÄ¡£subshellµÄtrapÉèÖøú¸¸½ø³Ì¸ÕÆô¶¯µÄʱºò»¹Ã»×ötrapÉèÖÃ֮ǰһÑù¡£
нø³Ìcoprocess
ÔÚbash 4.0°æ±¾Ö®ºó£¬ÎªÎÒÃÇÌṩÁËÒ»¸öcoproc¹Ø¼ü×Ö¿ÉÒÔÖ§³Öнø³Ì¡£Ð½ø³ÌÌṩÁËÒ»ÖÖ¿ÉÒÔÉÏbashÒÆ²½Ö´ÐÐÁíÒ»¸ö½ø³ÌµÄ¹¤×÷ģʽ£¬Êµ¼ÊÉϸú×÷Òµ¿ØÖÆÀàËÆ¡£ÑϸñÀ´Ëµ£¬bashµÄнø³Ì¾ÍÊÇʹÓÃ×÷Òµ¿ØÖÆ×÷ΪʵÏÖÊÖ¶ÎÀ´×öµÄ¡£Ëü¸ú×÷Òµ¿ØÖƵÄÇø±ð½ö½öÔÚÓÚ£¬Ð½ø³ÌµÄ±ê×¼ÊäÈëºÍ±ê×¼Êä³ö¶¼ÔÚµ÷ÓÃнø³ÌµÄbashÖпÉÒÔÈ¡µ½ÎļþÃèÊö·û£¬¶ø×÷Òµ¿ØÖƽø³ÌµÄ±ê×¼ÊäÈëºÍÊä³ö¶¼ÊÇÖ±½ÓÖ¸ÏòÖն˵ġ£ÎÒÃÇÀ´¿´¿´Ê¹ÓÃнø³ÌµÄÓï·¨£º
coproc [NAME] command [redirections] |
ʹÓÃcoproc×÷Ϊǰ׺£¬ºóÃæ¼ÓÖ´ÐеÄÃüÁ¿ÉÒÔ½«ÃüÁî·Åµ½×÷Òµ¿ØÖÆÀïÖ´ÐС£²¢ÇÒÔÚbashÖпÉÒÔͨ¹ýһЩ·½·¨²é¿´µ½Ð½ø³ÌµÄpidºÍʹÓÃËüµÄÊäÈëºÍÊä³ö¡£Àý×Ó£º
zorro@zorrozou-pc0 bash]$ cat coproc.sh #!/bin/bash #ÀýÒ»£º¼òµ¥ÃüÁîʹÓà #¼òµ¥ÃüÁîʹÓò»ÄÜͨ¹ýNAMEÖ¸¶¨Ð½ø³ÌµÄÃû×Ö£¬ ´Ëʱ½ø³ÌµÄÃû×ÖͳһΪ£ºCOPROC¡£ coproc tail -3 /etc/passwd echo $COPROC_PID exec 0<&${COPROC[0]}- cat
#Àý¶þ£º¸´ÔÓÃüÁîʹÓÃ
#´Ëʱ¿ÉÒÔʹÓÃNAME²ÎÊýÖ¸¶¨Ð½ø³ÌÃû³Æ£¬ ²¢¸ù¾ÝÃû³Æ²úÉúµÄÏà¹Ø±äÁ¿»ñµÃнø³ÌpidºÍÃèÊö·û¡£
coproc _cat { tail -3 /etc/passwd; }
echo $_cat_PID
exec 0<&${_cat[0]}-
cat
#ÀýÈý£º¸ü¸´ÔÓµÄÃüÁîÒÔ¼°ÊäÈëÊä³öʹÓÃ
#нø³ÌµÄ±ê×¼ÊäÈëÃèÊö·ûΪ£ºNAME[1]£¬ ±ê×¼Êä³öÃèÊö·ûΪ£ºNAME[0]¡£
coproc print_username {
while read string
do
[ "$string" = "END" ] &&
break
echo $string | awk -F: '{print $1}'
done
}
echo "aaa:bbb:ccc" 1>&${print_username[1]}
echo ok
read -u ${print_username[0]} username
echo $username
cat /etc/passwd >&${print_username[1]}
echo END >&${print_username[1]}
while read -u ${print_username[0]} username
do
echo $username
done |
Ö´Ðнá¹û£º
[zorro@zorrozou-pc0 bash]$ ./coproc.sh 31953 jerry:x:1001:1001::/home/jerry:/bin/bash systemd-coredump:x:994:994:systemd Core Dumper:/:/sbin/nologin netdata:x:134:134::/var/cache/netdata:/bin/nologin 31955 jerry:x:1001:1001::/home/jerry:/bin/bash systemd-coredump:x:994:994:systemd Core Dumper:/:/sbin/nologin netdata:x:134:134::/var/cache/netdata:/bin/nologin ok aaa root bin daemon mail ftp http uuidd dbus nobody systemd-journal-gateway systemd-timesync systemd-network systemd-bus-proxy systemd-resolve systemd-journal-remote systemd-journal-upload polkitd avahi colord rtkit gdm usbmux git gnome-initial-setup zorro nvidia-persistenced ntp jerry systemd-coredump netdata |
×îºó
±¾ÎÄÖ÷Òª½éÉÜÁËһЩbash±à³ÌµÄ³£Óü¼ÇÉ£¬Ö÷Òª°üÀ¨µÄ֪ʶµãΪ£º
1¡¢/dev/ºÍ/procĿ¼µÄʹÓá£
2¡¢º¯ÊýºÍµÝ¹é¡£
3¡¢²¢·¢±à³ÌºÍflock¡£
4¡¢ÊÜÏÞbash¡£
5¡¢subshell¡£
6¡¢Ð½ø³Ì¡£
ÖÁ´Ë£¬ÎÒÃǵÄbash±à³ÌϵÁоÍËã½áÊøÁË¡£µ±È»£¬shellÆäʵµ½ÏÖÔڲŸոտªÊ¼¡£±Ï¾¹ÎÒÃÇÒªÕæÕýʵÏÖÓÐÓõÄbash³ÌÐò£¬»¹ÐèÒª»ýÀÛ´óÁ¿ÃüÁîµÄʹÓᣱ¾ÎÄÆª·ùÓÐÏÞ£¬¾Í²»Ì½ÌÖÍⲿÃüÁîµÄÏêϸʹÓ÷½·¨ºÍ¼¼ÇÉÁË¡£Ï£ÍûÕâһϵÁÐÄÚÈݶԴó¼Ò½øÒ»²½ÉîÈëÁ˽âbash±à³ÌÓаïÖú¡£ |