°í±Þ Bash ½ºÅ©¸³ÆÃ °¡À̵å: Bash¸¦ ÀÌ¿ëÇÑ ½© ½ºÅ©¸³ÆÃ ¿ÏÀü °¡À̵å | ||
---|---|---|
ÀÌÀü | 9Àå. º¯¼ö Àç°ËÅä(Variables Revisited) | ´ÙÀ½ |
Bash ½ºÅ©¸³Æ®ÀÇ µ¿ÀÛ¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â º¯¼ö
Bash ½ÇÇà ÆÄÀÏÀÇ °æ·Î·Î, º¸ÅëÀº /bin/bashÀÓ
½ºÅ©¸³Æ®°¡ ½ÇÇàµÉ ¶§ ¾îµð¿¡¼ bash ½ÃÀÛ ÆÄÀÏÀ» ÀÐÀ» °ÍÀÎÁö¸¦ ³ªÅ¸³»´Â ȯ°æ º¯¼ö
¿ø¼Ò °¹¼ö°¡ 6°³ÀÎ ¹è¿·Î, ÇöÀç ¼³Ä¡µÈ Bash ¹öÀü¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ½À´Ï´Ù. ´ÙÀ½¿¡ ¼³¸íÇÒ $BASH_VERSION °ú ºñ½ÁÇÏÁö¸¸ Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ´ã°í ÀÖ½À´Ï´Ù.
# Bash ¹öÀü Á¤º¸: for n in 0 1 2 3 4 5 do echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}" done # BASH_VERSINFO[0] = 2 # Major version no. # BASH_VERSINFO[1] = 04 # Minor version no. # BASH_VERSINFO[2] = 21 # Patch level. # BASH_VERSINFO[3] = 1 # Build version. # BASH_VERSINFO[4] = release # Release status. # BASH_VERSINFO[5] = i386-redhat-linux-gnu # Architecture # ($MACHTYPE °ú µ¿ÀÏ). |
½Ã½ºÅÛ¿¡ ¼³Ä¡µÈ Bash ¹öÀü
bash$ echo $BASH_VERSION 2.04.12(1)-release |
tcsh% echo $BASH_VERSION BASH_VERSION: Undefined variable. |
¾î¶² ½©·Î µ¿ÀÛÁßÀÎÁö ¾Ë¾Æº¸·Á°í ÇÒ ¶§ $BASH_VERSION À» È®ÀÎÇØ º¸´Â °ÍÀº ¾ÆÁÖ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù. ¿Ö³ÄÇϸé, $SHELL ·Î´Â ÃæºÐÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù.
µð·ºÅ丮 ½ºÅÃÀÇ ³»¿ë(pushd¿Í popdÀÇ ¿µÇâÀ» ¹ÞÀ½)
ÀÌ ³»Àå º¯¼ö´Â dirs ¸í·É¾î¿Í ¦À» ÀÌ·ì´Ï´Ù.
½ºÅ©¸³Æ®°¡ ºÎ¸£´Â ¿¡µðÅͷμ, º¸ÅëÀº vi³ª emacsÀÔ´Ï´Ù.
"À¯È¿" »ç¿ëÀÚ ¾ÆÀ̵𠰪
su¿¡ ÀÇÇØ ¾²ÀÏ ÇöÀç »ç¿ëÀÚÀÇ À¯È¿ ¾ÆÀ̵𠰪.
°æ°í |
$EUID´Â $UID¿Í ¹Ýµå½Ã °°Áö ¾Ê½À´Ï´Ù. |
ÇöÀç ÇÔ¼öÀÇ À̸§
xyz23 () { echo "$FUNCNAME now executing." # xyz23 now executing. } xyz23 echo "FUNCNAME = $FUNCNAME" # FUNCNAME = # ÇÔ¼ö ¹Û¿¡¼´Â ³Î °ªÀ» °®½À´Ï´Ù. |
globbing ½Ã Æ÷ÇÔµÇÁö ¾ÊÀ» ÆÄÀÏ¸í ÆÐÅϵéÀÇ ¸ñ·Ï.
ÇöÀç »ç¿ëÀÚ°¡ ¼ÓÇØ ÀÖ´Â ±×·ì
/etc/passwd¿¡ ÀûÇô ÀÖ´Â ÇöÀç »ç¿ëÀÚÀÇ ±×·ì ¾ÆÀ̵𠰪À» º¸¿©ÁÝ´Ï´Ù.
»ç¿ëÀÚÀÇ È¨ µð·ºÅ丮·Î, º¸ÅëÀº /home/username (¿¹ 9-10 Âü°í)
hostname ¸í·É¾î´Â ºÎÆÃ½Ã init ½ºÅ©¸³Æ®¿¡¼ ½Ã½ºÅÛ À̸§À» ¼³Á¤ÇØ ÁÝ´Ï´Ù. ÇÏÁö¸¸ gethostname() ÇÔ¼ö·Î bash ³»ºÎ º¯¼öÀÎ $HOSTNAMEÀ» ¼³Á¤ÇØ ÁÙ ¼öµµ ÀÖ½À´Ï´Ù. ¿¹ 9-10À» Âü°íÇϼ¼¿ä.
host type
$MACHTYPE°ú ¸¶Âù°¡Áö·Î ½Ã½ºÅÛ Çϵå¿þ¾î¸¦ ¾Ë·ÁÁÝ´Ï´Ù.
bash$ echo $HOSTTYPE i686 |
ÀÔ·Â ÇÊµå ±¸ºÐÀÚ
µðÆúÆ®´Â °ø¹é¹®ÀÚ(ºóÄ, ÅÇ, ´º¶óÀÎ)Áö¸¸ ÄÞ¸¶·Î ±¸ºÐµÈ µ¥ÀÌŸ ÆÄÀÏÀ» ÆÄ½ÌÇÏ·Á´Â °æ¿ìó·³ º¯°æÀÌ °¡´ÉÇÕ´Ï´Ù. $*´Â $IFSÀÇ Ã¹¹øÂ° ¹®ÀÚ¸¦ »ç¿ëÇÏ´Â °Í¿¡ ÁÖÀÇÇϼ¼¿ä. ¿¹ 6-1 Âü°í.
bash$ echo $IFS | cat -vte $ bash$ bash -c 'set w x y z; IFS=":-;"; echo "$*"' w:x:y:z |
(S. C. ¿¡°Ô Á¤È®ÇÑ ¼³¸í°ú ¿¹Á¦¿¡ °¨»ç.)
EOF ¹«½Ã: ·Î±× ¾Æ¿ôÇϱâ Àü¿¡ ¸î °³ÀÇ end-of-files (control-D)¸¦ ¹«½ÃÇÒ °ÍÀÎÁö.
ÁÖ·Î .bashrc ³ª /etc/profile ¿¡¼ ¼¼Æ®µÇ´Â ÀÌ º¯¼ö´Â ÆÄÀϸí È®ÀåÀ̳ª ÆÐÅÏ ¸ÅνÃÀÇ ´ëÁ¶(collation) ¼ø¼¸¦ Á¦¾îÇÕ´Ï´Ù. ÀÌ °ªÀÌ À߸ø ó¸®µÇ¸é ÆÄÀϸí globbing½Ã ¿øÄ¡ ¾Ê´Â °á°ú¸¦ °¡Á® ¿Ã ¼ö ÀÖ½À´Ï´Ù.
Âü°í: Bash 2.05 ÀÌÈÄ·Î, ÆÄÀϸí globbing Àº ´ë°ýÈ£¿¡ µé¾î ÀÖ´Â ¹®ÀÚ ¹üÀ§¿¡ ³ªÅ¸³ª´Â ´ë¼Ò¹®ÀÚ¸¦ ´õ ÀÌ»ó ±¸ºÐÇÏÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¾î, ls [A-M]* Àº File2.txt¿Í file1.txt ¸ðµÎ¿Í ÀÏÄ¡µÉ °ÍÀÔ´Ï´Ù. ÀڽŸ¸ÀÇ ´ë°ýÈ£ ¸ÅĪ µ¿ÀÛÀ» ¿ø·¡´ë·Î ¹Ù²Ù·Á¸é /etc/profileÀ̳ª ~/.bashrcµî¿¡ export LC_COLLATE=C ¶ó°í ÇØ¼ LC_COLLATEÀ» C·Î ¼¼Æ®ÇØ ÁÖ¸é µË´Ï´Ù.
ÀÌ ³»ºÎ º¯¼ö´Â globbing °ú ÆÐÅÍ ¸ÅĪÀÇ ¹®ÀÚ ÇØ¼®À» Á¦¾îÇÕ´Ï´Ù.
½© ½ºÅ©¸³Æ®¿¡¼ ÀÌ º¯¼ö°¡ µé¾î ÀÖ´Â ÁÙÀÇ ÁÙ¹øÈ£¸¦ ³ªÅ¸³»´Âµ¥, ½ºÅ©¸³Æ®¿¡¼ ¾²ÀÏ ¶§¸¸ Àǹ̰¡ ÀÖ°í, ÁÖ·Î µð¹ö±ë¿¡ ¾²ÀÔ´Ï´Ù.
last_cmd_arg=$_ # ÀúÀå. echo "$LINENO ¹øÂ° ÁÙ, º¯¼ö \"v1\" = $v1" echo "ó¸®µÈ ¸¶Áö¸· ¸í·É¾î ÀÎÀÚ = $last_cmd_arg" |
¸Ó½Å Á¾·ù
½Ã½ºÅÛ Çϵå¿þ¾î¸¦ ±¸ºÐÇØ ÁÝ´Ï´Ù.
bash$ echo $MACHTYPE i686-debian-linux-gnu |
¹Ù·Î Àü ÀÛ¾÷ µð·ºÅ丮 ("OLD-print-working-directory")
¿î¿µ üÁ¦ Á¾·ù
bash$ echo $OSTYPE linux-gnu |
½ÇÇà ÆÄÀÏÀÇ °æ·Î, º¸ÅëÀº /usr/bin/, /usr/X11R6/bin/, /usr/local/bin, µîµî.
¸í·É¾î°¡ ÁÖ¾îÁö¸é ½©Àº ½ÇÇà ÆÄÀϵéÀ» À§ÇÑ °æ·Î¿¡ µé¾îÀÖ´Â µð·ºÅ丮µé¿¡ ´ëÇØ¼ ÀÚµ¿À¸·Î ÇØ½¬ Å×À̺í Ž»öÀ» ¼öÇàÇÕ´Ï´Ù. °æ·Î¿¡´Â ȯ°æ º¯¼öÀÎ $PATH¿¡ µð·ºÅ丮µéÀÌ ÄÝ·ÐÀ¸·Î ±¸ºÐµÇ¾î µé¾î ÀÖ½À´Ï´Ù. º¸Åë $PATH Á¤ÀÇ´Â /etc/profileÀ̳ª ~/.bashrc¿¡ µé¾î ÀÖ½À´Ï´Ù(27Àå Âü°í).
bash$ echo $PATH /bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/sbin:/usr/sbin |
PATH=${PATH}:/opt/bin ¶ó°í Çϸé /opt/binÀ» ÇöÀç °æ·Î¿¡ Ãß°¡ ½Ãŵ´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é °æ·Î¿¡ Àӽ÷Πµð·ºÅ丮¸¦ ÀûÀýÇÏ°Ô Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ºÅ©¸³Æ®°¡ ³¡³ª¸é ¿ø·¡ $PATH ·Î º¹±¸µË´Ï´Ù(½ºÅ©¸³Æ®°°Àº ÀÚ½Ä ÇÁ·Î¼¼½º´Â ºÎ¸ð ÇÁ·Î¼¼½ºÀÎ ½©ÀÇ È¯°æ º¯¼ö¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù).
Âü°í: º¸ÅëÀº ÇöÀç "ÀÛ¾÷ µð·ºÅ丮"¸¦ ³ªÅ¸³»´Â ./Àº º¸¾È»óÀÇ ÀÌÀ¯·Î $PATH¿¡¼ Á¦¿Ü½Ãŵ´Ï´Ù.
¸¶Áö¸·À¸·Î ½ÇÇàµÈ ÆÄÀÌÇÁÀÇ Á¾·á »óÅÂ. ¾ÆÁÖ Àç¹ÌÀÖ´Â °ÍÀº, ÀÌ °á°ú¿Í ¸¶Áö¸·À¸·Î ½ÇÇàµÈ ¸í·É¾îÀÇ Á¾·á »óŰ¡ ¶È°°Áö´Â ¾Ê´Ù´Â °ÍÀÔ´Ï´Ù.
bash$ echo $PIPESTATUS 0 bash$ ls -al | bogus_command bash: bogus_command: command not found bash$ echo $PIPESTATUS 141 bash$ ls -al | bogus_command bash: bogus_command: command not found bash$ echo $? 127 |
¾î¶² ÇÁ·Î¼¼½ºÀÇ ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ÇÁ·Î¼¼½º ¾ÆÀ̵ð(pid)¸¦ $PPIDÀ̶ó°í ÇÕ´Ï´Ù. [1]
À̰͵éÀ» pidof ¸í·É¾î¿Í ºñ±³ÇØ º¸¼¼¿ä.
¸í·É¾îÁÙ¿¡¼ º¼ ¼ö ÀÖ´Â ¸ÞÀÎ ÇÁ·ÒÇÁÆ®.
2Â÷ ÇÁ·ÒÇÁÆ®·Î, Ãß°¡ÀûÀÎ ÀÔ·ÂÀÌ ÇÊ¿äÇÒ ¶§ ">" ·Î Ç¥½ÃµË´Ï´Ù.
4Â÷ ÇÁ·ÒÇÁÆ®·Î, ½ºÅ©¸³Æ®¿¡ -x ¿É¼ÇÀÌ °É·Á¼ ½ÇÇàµÉ ¶§ ½ºÅ©¸³Æ®ÀÇ ¸Å ÁÙ¸¶´Ù "+"·Î Ç¥½ÃµË´Ï´Ù.
ÀÛ¾÷ µð·ºÅ丮(ÇöÀç ÀÖ´Â µð·ºÅ丮)
³»Àå ¸í·ÉÀÎ pwd¿Í ºñ½ÁÇÕ´Ï´Ù.
#!/bin/bash E_WRONG_DIRECTORY=73 clear # ȸé Á¤¸®. TargetDirectory=/home/bozo/projects/GreatAmericanNovel cd $TargetDirectory echo "$TargetDirectory µð·ºÅ丮ÀÇ ¿À·¡µÈ ÆÄÀÏÀ» Áö¿ó´Ï´Ù." if [ "$PWD" != "$TargetDirectory" ] then # ½Ç¼ö·Î ´Ù¸¥ µð·ºÅ丮¸¦ Áö¿ìÁö ¾Ê°Ô ÇÕ´Ï´Ù. echo "Áö¿ï µð·ºÅ丮°¡ ¾Æ´Õ´Ï´Ù!" echo "$TargetDirectory µð·ºÅ丮°¡ ¾Æ´Ï¶ó $PWD µð·ºÅ丮ÀÔ´Ï´Ù," echo "Ãë¼ÒÇÕ´Ï´Ù!" exit $E_WRONG_DIRECTORY fi rm -rf * rm .[A-Za-z0-9]* # µµÆ® ÆÄÀÏ »èÁ¦. # À̸§ÀÌ ¿©·¯°³ÀÇ Á¡À¸·Î ½ÃÀÛÇÏ´Â ÆÄÀϵµ Áö¿ì·Á¸é ÀÌ·¸°Ô Çϼ¼¿ä. rm -f .[^.]* ..?* # (shopt -s dotglob; rm -f *) ¶ó°í ÇØµµ µË´Ï´Ù. # ÁöÀûÇØ Á༠°í¸¶¿ö¿ä. S.C. # ÆÄÀÏÀ̸§¿¡´Â "/"¸¦ Á¦¿ÜÇϰí 0 - 255 »çÀÌÀÇ ¸ðµç ¹®ÀÚ°¡ µé¾î°¥ ¼ö ÀÖ½À´Ï´Ù. # ÀÌ»óÇÑ ¹®ÀÚ·Î ½ÃÀÛÇÏ´Â ÆÄÀÏÀ» Áö¿ì´Â °ÍÀº ¿¬½À¹®Á¦·Î ³²°Ü ³õ½À´Ï´Ù. # ÇÊ¿äÇÏ´Ù¸é ´Ù¸¥ ÀÛ¾÷À» Çϼ¼¿ä. echo echo "³¡." echo "$TargetDirectory µð·ºÅ丮ÀÇ ¿À·¡µÈ ÆÄÀÏÀ» ¸ðµÎ »èÁ¦Çß½À´Ï´Ù." echo exit 0 |
read¿¡ º¯¼ö°¡ ¾È ÁÖ¾îÁ³À» ¶§ ÀúÀåµÇ´Â ±âº»°ªÀ̰í, select ¸Þ´º¿¡¼´Â º¯¼öÀÇ °ªÀÌ ¾Æ´Ï¶ó ¼±ÅÃÇÑ ¼ýÀÚ°¡ ÀúÀåµË´Ï´Ù.
#!/bin/bash echo echo -n "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä°¡ ¹¹¿¡¿ä? " read echo "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä°¡ $REPLY ±º¿ä." # REPLY ´Â °¡Àå ÃÖ±ÙÀÇ "read"°¡ º¯¼ö ¾øÀÌ ÁÖ¾îÁ³À» ¶§ ±× °ªÀ» ´ã°í ÀÖ½À´Ï´Ù. echo echo -n "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â °úÀÏÀº¿ä? " read fruit echo "´ç½ÅÀÌ Á¦ÀÏ ÁÁ¾ÆÇÏ´Â °úÀÏÀº $fruit Áö¸¸," echo "\$REPLY ÀÇ °ªÀº ¿©ÀüÈ÷ $REPLY ³×¿ä." # $fruit º¯¼ö°¡ "read"ÀÇ °ªÀ» °¡Á®°¡ ¹ö·È±â ¶§¹®¿¡ $REPLY ´Â ¿©ÀüÈ÷ # ¾Õ¿¡¼ ¼³Á¤µÈ °ªÀ» °®°í ÀÖ½À´Ï´Ù. echo exit 0 |
½ºÅ©¸³Æ®°¡ ¾ó¸¶³ª µ¹¾Ò´ÂÁö¸¦ ³ªÅ¸³»´Â ÃÊ ´ÜÀ§ ½Ã°£.
#!/bin/bash ENDLESS_LOOP=1 INTERVAL=1 echo echo "½ºÅ©¸³Æ®¸¦ ³¡³»·Á¸é Control-C ¸¦ ´©¸£¼¼¿ä." echo while [ $ENDLESS_LOOP ] do if [ "$SECONDS" -eq 1 ] then units=second else units=seconds fi echo "ÀÌ ½ºÅ©¸³Æ®´Â $SECONDS $units µ¿¾È µ¹°í ÀÖ½À´Ï´Ù." sleep $INTERVAL done exit 0 |
ÇöÀç ÄÑ ÀÖ´Â ½© ¿É¼ÇµéÀÇ ¸ñ·ÏÀ¸·Î¼ Àбâ Àü¿ë º¯¼ö
½© ·¹º§·Î Bash °¡ ¾ó¸¶³ª ±íÀÌ ÁßøµÇ¾î ÀÖ´ÂÁö¸¦ ³ªÅ¸³¿. ¸¸¾à¿¡ ¸í·É¾îÁÙ¿¡¼ $SHLVL ÀÌ 1 À̾ú´Ù¸é ½ºÅ©¸³Æ®¿¡¼´Â 2 °¡ µË´Ï´Ù.
$TMOUT ȯ°æ º¯¼ö¸¦ 0 ÀÌ ¾Æ´Ñ °ª timeÀ¸·Î ¼³Á¤ÇØ ³õÀ¸¸é ±× ½Ã°£ÀÌ Áö³ ´ÙÀ½¿¡´Â ·Î±×¾Æ¿ôÀÌ µË´Ï´Ù.
Âü°í: ºÒÇàÇϰԵµ ÀÌ º¯¼ö´Â ÄֻܼóÀÇ ½© ÇÁ·ÒÇÁÆ®³ª ¿¢½ºÅÒ(ÇÑÅÒ)¿¡¼¸¸ µ¿ÀÛÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, read ¹®¿¡¼ $TMOUTÀ» °°ÀÌ ¾²°í ½Í°ÚÁö¸¸ ½ÇÁ¦·Î´Â Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù.(ksh ¹öÀü¿¡¼´Â readÀÇ Å¸ÀӾƿôÀÌ Á¦´ë·Î µ¿ÀÛÇÑ´Ù°í º¸°íµÈ ¹Ù ÀÖ½À´Ï´Ù).
ŸÀÓ ¾Æ¿ôÀ» ½© ½ºÅ©¸³Æ®¿¡¼ ±¸ÇöÇÒ ¼ö´Â ÀÖÀ¸³ª ±×·¸°Ô È¿°úÀûÀÌÁö ¾Ê½À´Ï´Ù. ÇѰ¡Áö °¡´ÉÇÑ ¹æ¹ýÀº, ŸÀÓ ¾Æ¿ôÀÌ ³µÀ» ¶§ ŸÀÌ¹Ö ·çÇÁ°¡ ½ºÅ©¸³Æ®¿¡°Ô ½Ã±×³ÎÀ» º¸³»µµ·Ï ¼¼ÆÃÇØ¾ß Çϰí ŸÀÌ¹Ö ·çÇÁ°¡ ¹ß»ý½ÃŲ (¿¹ 30-4 Âü°í) ÀÎÅÍ·´Æ®¸¦ ó¸®ÇÒ ½Ã±×³Î ó¸® ·çƾµµ ¸¸µé¾î¾ß ÇÕ´Ï´Ù, ÈÞ~~.
¿¹ 9-2. ŸÀÓ ¾Æ¿ô ó¸® ÀÔ·Â
#!/bin/bash # timed-input.sh # TMOUT=3 ½ºÅ©¸³Æ®¿¡¼´Â ¾µ¸ð°¡ ¾ø½À´Ï´Ù. TIMELIMIT=3 # ¿©±â¼´Â 3ÃÊ, ´Ù¸¥ °ªÀ¸·Î ¼¼Æ®ÇÒ ¼ö ÀÖ½À´Ï´Ù. PrintAnswer() { if [ "$answer" = TIMEOUT ] then echo $answer else # µÎ ¹øÀÇ ÀνºÅϽº¸¦ ±¸ºÐÇϱâ À§Çؼ. echo "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä´Â $answer À̱º¿ä." kill $! # ¹é±×¶ó¿îµå¿¡¼ µµ´Â TimerOn ÇÔ¼ö°¡ ´õ ÀÌ»ó ÇÊ¿ä¾ø±â ¶§¹®¿¡ kill ½ÃÅ´. # $! ´Â ¹é±×¶ó¿îµå¿¡¼ µ¹°í ÀÖ´Â °¡Àå ÃÖ±Ù ÀÛ¾÷ÀÇ PID ÀÔ´Ï´Ù. fi } TimerOn() { sleep $TIMELIMIT && kill -s 14 $$ & # 3Ãʸ¦ ±â´Ù¸®°í ¾Ë¶÷ ½Ã±×³Î(sigalarm)À» ½ºÅ©¸³Æ®¿¡ º¸³¿. } Int14Vector() { answer="TIMEOUT" PrintAnswer exit 14 } trap Int14Vector 14 # ŸÀÌ¸Ó ÀÎÅÍ·´Æ®(14)´Â ¿ì¸® Àǵµ´ë·Î ŸÀӾƿôÀ» ó¸®ÇÔ. echo "Á¦ÀÏ ÁÁ¾ÆÇÏ´Â ¾ßä°¡ ¹¹ÁÒ? " TimerOn read answer PrintAnswer # ÀÌ´Â ºÐ¸íÈ÷ ŸÀӾƿô ÀԷ¿¡ ´ëÇÑ ¹ÌºÀÃ¥ÀÔ´Ï´Ù¸¸, # Bash ·Î ÇÒ ¼ö ÀÖ´Â ÃÖ¼±À» ´ÙÇÑ °ÍÀÔ´Ï´Ù. # (µ¶Àڵ鿡°Ô µµÀü: ´õ ³ªÀº ÇØ°áÃ¥À» Á¦½ÃÇØ º¸¼¼¿ä.) # ´õ ¿ì¾ÆÇÑ ´Ù¸¥ °ÍÀÌ ÇÊ¿äÇÏ´Ù¸é C ³ª C++ ÀÇ 'alarm'À̳ª 'setitimer' °°Àº # Àû´çÇÑ ¶óÀ̺귯¸® ÇÔ¼ö¸¦ ½á¼ ±¸ÇöÇϱ⠹ٶø´Ï´Ù. exit 0 |
stty¸¦ ¾´ ´Ù¸¥ ¹æ¹ý.
¿¹ 9-3. ŸÀÓ ¾Æ¿ô ó¸® ÀÔ·Â, ÇÑ ¹ø ´õ
#!/bin/bash # timeout.sh # Stephane Chazelas ÀÛ¼º. # ÀÌ ¹®¼ÀÇ ÀúÀÚ°¡ ¼öÁ¤. INTERVAL=5 # ŸÀӾƿô ÀÎÅ͹ú timedout_read() { timeout=$1 varname=$2 old_tty_settings=`stty -g` stty -icanon min 0 time ${timeout}0 eval read $varname # ¾Æ´Ï¸é ±×³É read $varname stty "$old_tty_settings" # "stty" ¸Ç ÆäÀÌÁö ÂüÁ¶. } echo; echo -n "À̸§ÀÌ ¹¹ÁÒ? »¡¸® ´ë´äÇØ¿ä! " timedout_read $INTERVAL your_name # ¸ðµç Å͹̳ΠŸÀÔ¿¡¼ µ¿ÀÛÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù. # ÃÖ´ë ŸÀӾƿôÀº ¾î¶² Å͹̳ÎÀ̳Ŀ¡ ´Þ·ÁÀÖ½À´Ï´Ù. # (º¸ÅëÀº 25.5 ÃÊ). echo if [ ! -z "$your_name" ] # ŸÀӾƿô Àü¿¡ ÀÔ·ÂÀÌ ÀÖ´Ù¸é... then echo "¾ÆÇÏ, À̸§ÀÌ $your_name ±º¿ä." else echo "ŸÀӾƿô." fi echo # ÀÌ ½ºÅ©¸³Æ®´Â "timed-input.sh" ½ºÅ©¸³Æ®¿Í ¾à°£ ´Ù¸£°Ô µ¿ÀÛÇϴµ¥, # ۰¡ ´¸± ¶§¸¶´Ù ŸÀӾƿô Ä«¿îÅͰ¡ ¸®¼ÂµË´Ï´Ù. exit 0 |
»ç¿ëÀÚ ¾ÆÀ̵𠰪
/etc/passwd¿¡ ÀúÀåµÇ¾î ÀÖ´Â ÇöÀç »ç¿ëÀÚÀÇ »ç¿ëÀÚ ½Äº° ¼ýÀÚ
ºñ·Ï su¿¡ ÀÇÇØ¼ Àӽ÷Π´Ù¸¥ »ç¿ëÀÚ·Î ÀνĵǴõ¶óµµ ÇöÀç »ç¿ëÀÚÀÇ ½ÇÁ¦ ¾ÆÀ̵𸦠³ªÅ¸³À´Ï´Ù. $UID´Â Àб⸸ µÇ´Â º¯¼ö·Î ¸í·É¾î ÁÙÀ̳ª ½ºÅ©¸³Æ®¿¡¼ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù. ±×¸®°í, id ³»Àå ¸í·É°ú ¦À» ÀÌ·ì´Ï´Ù.
¿¹ 9-4. ³»°¡ ·çÆ®Àΰ¡?
#!/bin/bash # am-i-root.sh: ³»°¡ ·çÆ®¾ß ¾Æ´Ï¾ß? ROOT_UID=0 # ·çÆ® $UID´Â 0. if [ "$UID" -eq "$ROOT_UID" ] # Will the real "root" please stand up? then echo "·çÆ®³×¿ä." else echo "±×³É º¸Åë »ç¿ëÀÚ¿¡¿ä.(±×·¡µµ ´ç½Å ¾î¸Ó´Ï´Â ÀÖ´Â ±×´ë·ÎÀÇ ´ç½ÅÀ» »ç¶ûÇϽŴä´Ï´Ù)." fi exit 0 # ============================================================= # # ½ºÅ©¸³Æ®°¡ ÀÌ¹Ì Á¾·áµÆ±â ¶§¹®¿¡ ¹ØÀÇ ÄÚµå´Â ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù. # ·çÆ®ÀÎÁö ¾Ë¾Æ³»´Â ´Ù¸¥ ¹æ¹ý: ROOTUSER_NAME=root username=`id -nu` if [ "$username" = "$ROOTUSER_NAME" ] then echo "·çƼ ÅõÆ® ÅõÆ®(Rooty, toot, toot), ´ç½ÅÀº ·çÆ® »ç¿ëÀÚ±º¿ä." else echo "±×³É º¸Åë »ç¶÷À̱º¿ä." fi exit 0 |
¿¹ 2-2 Âü°í.
Âü°í: $ENV, $LOGNAME, $MAIL, $TERM, $USER, $USERNAMEÀº bash ³»Àå ¸í·ÉÀÌ ¾Æ´Õ´Ï´Ù. ÇÏÁö¸¸ Á¾Á¾ bash ½Ã½ºÅÛ ±¸µ¿ ÆÄÀÏ¿¡¼ ȯ°æ º¯¼ö·Î ¼³Á¤ÀÌ µË´Ï´Ù. »ç¿ëÀÚÀÇ ·Î±ä ½©À» ³ªÅ¸³»´Â $SHELLÀº /etc/passwd¸¦ Âü°íÇØ ¼³Á¤µÇ°Å³ª "init" ½ºÅ©¸³Æ®¿¡¼ ¼³Á¤µÇ°í, ¿ª½Ã bash ³»Àå¸í·É¾î°¡ ¾Æ´Õ´Ï´Ù.
tcsh% echo $LOGNAME bozo tcsh% echo $SHELL /bin/tcsh tcsh% echo $TERM rxvt bash$ echo $LOGNAME bozo bash$ echo $SHELL /bin/tcsh bash$ echo $TERM rxvt
À§Ä¡ ¸Å°³º¯¼ö(Positional Parameters)
À§Ä¡ ¸Å°³º¯¼ö·Î¼, ¸í·É¾îÁÙ¿¡¼ ½ºÅ©¸³Æ®·Î ³Ñ°ÜÁö°Å³ª ÇÔ¼ö·Î ³Ñ°ÜÁö°Å³ª set ¸í·É¾î·Î °Á¦·Î ¼³Á¤µÊ(¿¹ 5-5 °ú ¿¹ 11-10 Âü°í).
ÇÑ ³¹¸»·Î Ç¥½ÃµÇ´Â À§Ä¡ ¸Å°³º¯¼öµé ¸ðµÎ
$*°ú ¶È°°Áö¸¸ °¢ ¸Å°³º¯¼ö´Â Äõ¿ìÆ®µÈ ¹®ÀÚ¿·Î Ãë±ÞµË´Ï´Ù. Áï, ÇØ¼®µÇ°Å³ª È®Àå¾øÀÌ ÀÖ´Â ±×´ë·Î ³Ñ°ÜÁý´Ï´Ù. ±× °á°ú·Î °¢ ÀÎÀÚ´Â °¢°¢ÀÌ ¼·Î ´Ù¸¥ ³¹¸»·Î ±¸ºÐµÅ¼ Ç¥½ÃµË´Ï´Ù.
¿¹ 9-5. arglist: $* °ú $@ ·Î ÀÎÀÚ¸¦ ³ª¿Çϱâ
#!/bin/bash # ÀÌ ½ºÅ©¸³Æ®¸¦ ºÎ¸¦ ¶§ "one two three" °°Àº ÀÎÀÚ¸¦ Á༠ºÎ¸£¼¼¿ä. E_BADARGS=65 if [ ! -n "$1" ] then echo "»ç¿ë¹ý: `basename $0` argument1 argument2 etc." exit $E_BADARGS fi echo index=1 echo "\"\$*\" ·Î ÀÎÀÚ¸¦ ³ª¿Çϱâ:" for arg in "$*" # "$*" ¸¦ Äõ¿ìÆ®ÇÏÁö ¾ÊÀ¸¸é Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù. do echo "Arg #$index = $arg" let "index+=1" done # $* ´Â ¸ðµç ÀÎÀÚ¸¦ ÇϳªÀÇ ³¹¸»·Î º¾´Ï´Ù. echo "Àüü ÀÎÀÚ ¸ñ·ÏÀº ÇϳªÀÇ ³¹¸»·Î ³ªÅ¸³³´Ï´Ù." echo index=1 echo "\"\$@\" ·Î ÀÎÀÚ¸¦ ³ª¿Çϱâ:" for arg in "$@" do echo "Arg #$index = $arg" let "index+=1" done # $@ ´Â ÀÎÀÚµéÀ» ºÐ¸®µÈ ³¹¸»·Î º¾´Ï´Ù. echo "Àüü ÀÎÀÚ ¸ñ·ÏÀº ºÐ¸®µÈ ³¹¸»·Î ³ªÅ¸³³´Ï´Ù." echo exit 0 |
Ư¼ö ¸Å°³º¯¼öÀÎ $@¿¡´Â ½© ½ºÅ©¸³Æ®·Î µé¾î¿À´Â ÀÔ·ÂÀ» ÇÊÅ͸µÇÏ´Â Åø·Î¼ ¾²ÀÔ´Ï´Ù. cat "$@"Àº ÀÚ½ÅÀÇ ¸Å°³º¯¼ö¸¦ Ç¥ÁØÀÔ·ÂÀ̳ª ÆÄÀÏ¿¡¼ ¹Þ¾Æ µéÀÏ ¼ö ÀÖ½À´Ï´Ù. ¿¹ 12-17À» Âü°íÇϼ¼¿ä.
°æ°í |
$*°ú $@Àº °¡²û $IFSÀÇ ¼³Á¤°ª¿¡ µû¶ó Àϰü¼ºÀÌ ¾ø°í ÀÌ»óÇÑ µ¿ÀÛÀ» ÇÕ´Ï´Ù. |
¿¹ 9-6. Àϰü¼º ¾ø´Â $*°ú $@ÀÇ µ¿ÀÛ
#!/bin/bash # Äõ¿ìÆ® ¿©ºÎ¿¡ µû¶ó ÀÌ»óÇÏ°Ô µ¿ÀÛÇÏ´Â # Bash ³»ºÎ º¯¼ö "$*"¿Í "$@". # ³¹¸» Á¶°¢³²°ú ¶óÀÎÇǵ尡 Àϰü¼º ¾øÀÌ Ã³¸®µË´Ï´Ù. # ÀÌ ¿¹Á¦ ½ºÅ©¸³Æ®´Â Stephane Chazelas °¡ Á¦°øÇϰí, # º» ¹®¼ÀÇ ÀúÀÚ°¡ ¾à°£ ¼öÁ¤Çß½À´Ï´Ù. set -- "ù¹øÂ° ÀÎÀÚ" "µÎ¹øÂ°" "¼¼¹øÂ°:ÀÎÀÚ" "" "³×¹øÂ°: :ÀÎÀÚ" # ½ºÅ©¸³Æ®ÀÇ ÀÎÀÚ¸¦ $1, $2 µîÀ¸·Î ¼¼ÆÃ. echo echo 'IFS ´Â ±×´ë·Î, "$*"' c=0 for i in "$*" # Äõ¿ìÆ® do echo "$((c+=1)): [$i]" # ¸Å ÀνºÅϽº¸¶´Ù ¶È°°À½. # ÀÎÀÚ ¿¡ÄÚ. done echo --- echo 'IFS ´Â ±×´ë·Î, $*' c=0 for i in $* # Äõ¿ìÆ® ¾È ÇÔ do echo "$((c+=1)): [$i]" done echo --- echo 'IFS ´Â ±×´ë·Î, "$@"' c=0 for i in "$@" do echo "$((c+=1)): [$i]" done echo --- echo 'IFS ´Â ±×´ë·Î, $@' c=0 for i in $@ do echo "$((c+=1)): [$i]" done echo --- IFS=: echo 'IFS=":", "$*"' c=0 for i in "$*" do echo "$((c+=1)): [$i]" done echo --- echo 'IFS=":", $*' c=0 for i in $* do echo "$((c+=1)): [$i]" done echo --- var=$* echo 'IFS=":", "$var" (var=$*)' c=0 for i in "$var" do echo "$((c+=1)): [$i]" done echo --- echo 'IFS=":", $var (var=$*)' c=0 for i in $var do echo "$((c+=1)): [$i]" done echo --- var="$*" echo 'IFS=":", $var (var="$*")' c=0 for i in $var do echo "$((c+=1)): [$i]" done echo --- echo 'IFS=":", "$var" (var="$*")' c=0 for i in "$var" do echo "$((c+=1)): [$i]" done echo --- echo 'IFS=":", "$@"' c=0 for i in "$@" do echo "$((c+=1)): [$i]" done echo --- echo 'IFS=":", $@' c=0 for i in $@ do echo "$((c+=1)): [$i]" done echo --- var=$@ echo 'IFS=":", $var (var=$@)' c=0 for i in $var do echo "$((c+=1)): [$i]" done echo --- echo 'IFS=":", "$var" (var=$@)' c=0 for i in "$var" do echo "$((c+=1)): [$i]" done echo --- var="$@" echo 'IFS=":", "$var" (var="$@")' c=0 for i in "$var" do echo "$((c+=1)): [$i]" done echo --- echo 'IFS=":", $var (var="$@")' c=0 for i in $var do echo "$((c+=1)): [$i]" done echo # ÀÌ ½ºÅ©¸³Æ®¸¦ ksh À̳ª zsh -y ·Î ½ÇÇàÇØ º¸¼¼¿ä. exit 0 |
Âü°í: $@°ú $*´Â Å«µû¿ÈÇ¥·Î Äõ¿ìÆ® µÆÀ» ¶§¸¸ ´Þ¶óÁý´Ï´Ù.
¿¹ 9-7. $IFS °¡ ºñ¾î ÀÖÀ» ¶§ $*¿Í $@
#!/bin/bash # $IFS °¡ ºó »óÅ·Π¼¼Æ®µÆ´Ù¸é, # "$*" ¿Í "$@" ´Â À§Ä¡ ¸Å°³º¯¼ö¸¦ ¿ì¸®°¡ »ý°¢Çϴ´ë·Î ¿¡ÄÚÇÏÁö ¾Ê½À´Ï´Ù. mecho () # À§Ä¡ ¸Å°³º¯¼ö ¿¡ÄÚ. { echo "$1,$2,$3"; } IFS="" # ºó »óÅ·Π¼¼Æ®. set a b c # À§Ä¡ ¸Å°³º¯¼ö. mecho "$*" # abc,, mecho $* # a,b,c mecho $@ # a,b,c mecho "$@" # a,b,c # $IFS °¡ ºñ¾î ÀÖÀ» °æ¿ì¿¡ $* ¿Í $@ ÀÇ µ¿ÀÛÀº # Bash ³ª sh ÀÇ ¹öÀü¿¡ µû¶ó ´Þ¶óÁö±â ¶§¹®¿¡ # ½ºÅ©¸³Æ®¿¡¼ ÀÌ "±â´É"¿¡ ¾²´Â °ÍÀº ±ÇÀåÇÏÁö ¾Ê½À´Ï´Ù. # Thanks, S.C. exit 0 |
´Ù¸¥ Ư¼ö ¸Å°³º¯¼ö
½ºÅ©¸³Æ®·Î ³Ñ°ÜÁø Ç÷¡±×µé
°æ°í |
¿ø·¡ ksh¿¡¼ ¾²´ø °ÍÀ» bash¿¡¼ äÅÃÇÑ °ÍÀε¥ ºÒÇàÈ÷µµ Àß µ¿ÀÛÇÏÁö ¾Ê´Â °Í °°½À´Ï´Ù. ½ºÅ©¸³Æ® ÀÚ½ÅÀÌ ´ëÈÇüÀÎÁö ¾Æ´ÑÁö ½º½º·Î È®ÀÎÇÏ·Á°í ÇÏ´Â °æ¿ì¿¡³ª ¾µ¸¸ÇÕ´Ï´Ù. |
¹é±×¶ó¿îµå·Î µ¹°í ÀÖ´Â °¡Àå ÃÖ±Ù ÀÛ¾÷ÀÇ PID (process id)
¹Ù·Î ÀÌÀü¿¡ ½ÇÇàµÈ ¸í·É¾îÀÇ Á¦ÀÏ ¸¶Áö¸· ÀÎÀÚ·Î ¼³Á¤µÇ´Â Ư¼ö º¯¼ö.
½ºÅ©¸³Æ® ÀÚ½ÅÀÇ ÇÁ·Î¼¼½º ¾ÆÀ̵ð·Î º¸Åë Àӽà ÆÄÀÏ À̸§À» ¸¸µé ¶§ »ç¿ëÇÕ´Ï´Ù(¿¹ A-8¿Í ¿¹ 30-5, ¿¹ 12-23 Âü°í).
[1] | ÇöÀç µ¹°í ÀÖ´Â ½ºÅ©¸³Æ®ÀÇ pid ´Â $$ ÀÔ´Ï´Ù. |
[2] | "ÀÎÀÚ"(argument)³ª "¸Å°³º¯¼ö" (parameter)´Â ÈçÈ÷ ¼·Î ¹Ù²ã¼ ¾²±â ¶§¹®¿¡ ÀÌ ¹®¼¿¡¼´Â ½ºÅ©¸³Æ®³ª ÇÔ¼ö·Î ³Ñ°ÜÁö´Â º¯¼ö¸¦ ³ªÅ¸³»´Â °°Àº Àǹ̷Π¾²ÀÔ´Ï´Ù. |