Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Linux Shell±à³ÌÖ®³£Óü¼ÇÉ
 
×÷Õߣº×ÞÁ¢Î¡  À´Ô´£ºLinuxϵͳ¼¼Êõ ·¢²¼ÓÚ 2016-9-12
  2537  次浏览      27
 

ǰÑÔ

±¾Îļ¯ÖнéÉÜÁË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±à³ÌÓаïÖú¡£

   
2537 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þµÄ˼¿¼
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS
Ïà¹ØÅàѵ¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
Windows Azure ÔÆ¼ÆËãÓ¦ÓÃ

ĦÍÐÂÞÀ­ ÔÆÆ½Ì¨µÄ¹¹½¨ÓëÓ¦ÓÃ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ù
ijÑз¢ÖÐÐÄ Openstackʵ¼ù
ÖªÃûµç×Ó¹«Ë¾ ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦ÓÃ
ijµçÁ¦ÐÐÒµ »ùÓÚÔÆÆ½Ì¨¹¹½¨ÔÆ·þÎñ
ÔÆ¼ÆËãÓëWindows AzureÅàѵ
±±¾© ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ