32Àå. ¸î °¡Áö ÁöÀúºÐÇÑ °Íµé(Gotchas)

 

Åõ¶õµµÆ®(Turandot): ¼ö¼ö²²³¢´Â ¼¼ °³, ±×·¯³ª Á×À½Àº Çϳª!

Ä®¶óÇÁ(Caleph): ¾Æ´Ï¿À, ¼ö¼ö²²³¢´Â ¼¼ °³, »ý¸íÀÌ Çϳª!

 ÇªÄ¡´Ï(Puccini)

º¯¼ö¸í¿¡ ¿¹¾à¾î³ª ¿¹¾à ¹®ÀÚ¸¦ ÇÒ´çÇϱâ.
case=value0       # ¹®Á¦°¡ »ý±é´Ï´Ù.
23skidoo=value1   # ¿ª½Ã ¹®Á¦°¡ »ý±é´Ï´Ù.
# ¼ýÀÚ·Î ½ÃÀÛÇÏ´Â º¯¼ö¸íÀº ½©ÀÌ ¿¹¾àÇØ ³õ¾Ò½À´Ï´Ù.
# ´ë½Å _23skidoo=value1 ¸¦ ¾²¼¼¿ä. ¹ØÁÙ·Î ½ÃÀÛÇÏ´Â º¯¼ö´Â ±¦Âú½À´Ï´Ù.

# ÇÏÁö¸¸...       ¹ØÁٷθ¸ µÈ º¯¼ö¸íÀº Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù.
_=25
echo $_           # $_ Àº ¸¶Áö¸· ¸í·É¾îÀÇ ¸¶Áö¸· ÀÎÀÚ·Î ¼¼Æ®µÇ´Â Ư¼öÇÑ º¯¼öÀÔ´Ï´Ù.

xyz((!*=value2    # ½É°¢ÇÑ ¹®Á¦°¡ »ý±é´Ï´Ù.

º¯¼ö¸í¿¡ ÇÏÀÌÇÂÀ̳ª ´Ù¸¥ ¿¹¾à ¹®ÀÚ¸¦ ¾²±â.
var-1=23
# ´ë½Å 'var_1' ¸¦ ¾²¼¼¿ä.

º¯¼ö¿Í ÇÔ¼ö À̸§À» ¶È°°ÀÌ ¾²±â. ÀÌ·¸°Ô ÇÏ¸é ½ºÅ©¸³Æ®¸¦ ÀÌÇØÇϱⰡ Èûµì´Ï´Ù.
do_something ()
{
  echo "ÀÌ ÇÔ¼ö´Â \"$1\" ·Î ¹º°¡¸¦ ÇÕ´Ï´Ù."
}

do_something=do_something

do_something do_something

# ¹®¹ýÀûÀ¸·Î´Â ´Ù ¸ÂÁö¸¸ ¾öû³ª°Ô Çò°¥¸®ÁÒ?

ÀûÀýÄ¡ ¸øÇÑ °÷¿¡ °ø¹é¹®ÀÚ¸¦ ¾²´Â °Í(´Ù¸¥ ÇÁ·Î±×·¡¹Ö ¾ð¾îµé°ú´Â ´Þ¸® bash´Â °ø¹é¹®ÀÚ¿¡ ´ëÇØ Á» ±î´Ù·Î¿î ¹ÝÀÀÀ» º¸ÀÔ´Ï´Ù).
var1 = 23   # 'var1=23' ÀÌ ¸Â½À´Ï´Ù.
# ÀÌ·¸°Ô Çϸé bash´Â "="°ú "23" ÀÎÀÚ¸¦ °®´Â "var1" ¸í·É¾î¸¦ ½ÇÇà½ÃÅ°·Á°í ÇÕ´Ï´Ù.

let c = $a - $b   # 'let c=$a-$b' ³ª 'let "c = $a - $b"' °¡ ¸Â½À´Ï´Ù.

if [ $a -le 5]    # if [ $a -le 5 ]   °¡ ¸Â½À´Ï´Ù.
# if [ "$a" -le 5 ]   ¶ó°í ÇÏ¸é ´õ ÁÁ°ÚÁÒ.
# [[ $a -le 5 ]] µµ µ¿ÀÛÇÕ´Ï´Ù.

ÃʱâÈ­ ¾È µÈ º¯¼ö(°ªÀÌ ÇÒ´çµÇ±â ÀüÀÇ º¯¼ö)°¡ "0" ÀÎ °ÍÀ¸·Î °¡Á¤Çϱâ. ÃʱâÈ­ ¾È µÈ º¯¼öÀÇ °ªÀº 0ÀÌ ¾Æ´Ï¶ó "³Î"(null)ÀÔ´Ï´Ù.

Å×½ºÆ® ¹®¿¡¼­ = °ú -eq ¸¦ ¼¯¾î ¾²±â.= Àº ¹®ÀÚ¸¦ ºñ±³ÇÏ´Â °ÍÀÌ°í -eq Àº Á¤¼ö¸¦ ºñ±³ÇÏ´Â °ÍÀÓÀ» ¸í½ÉÇϼ¼¿ä.
if [ "$a" = 273 ]      # $a °¡ Á¤¼öÀΰ¡¿ä? ¹®ÀÚ¿­Àΰ¡¿ä?
if [ "$a" -eq 273 ]    # $a °¡ Á¤¼ö¶ó¸é.

# ¶§¶§·Î ¹Ý´ëÀÇ °á°ú¾øÀÌ -eq ¿Í = ¸¦ ¼¯¾î ¾µ ¼ö ÀÖ½À´Ï´Ù.
# ÇÏÁö¸¸...


a=273.0   # Á¤¼ö°¡ ¾Æ´Õ´Ï´Ù.

if [ "$a" = 273 ]
then
  echo "ºñ±³°¡ Àß µË´Ï´Ù."
else
  echo "ºñ±³°¡ Àß ¾È µË´Ï´Ù."
fi    # ºñ±³°¡ Àß ¾È µË´Ï´Ù.

# a=" 273" ¿Í a="0273" µµ ¸¶Âù°¡Áý´Ï´Ù.


# ºñ½ÁÇÏ°Ô, Á¤¼ö°¡ ¾Æ´Ñ ¼ýÀÚ¿¡ "-eq"¸¦ ¾²´Â°Íµµ ¹®Á¦¸¦ ÀÏÀ¸Åµ´Ï´Ù.

if [ "$a" -eq 273.0 ]
then
  echo "a = $a'
fi  # ¿¡·¯ ¸Þ¼¼Áö¸¦ ³»°í abort µË´Ï´Ù.
# test.sh: [: 273.0: integer expression expected

°¡²ûÀº "Å×½ºÆ®" ´ë°ýÈ£([ ])¾È¿¡¼­ ¾²ÀÌ´Â º¯¼ö¸¦ Å« µû¿ÈÇ¥·Î Äõ¿ìÆ® ÇØÁà¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ¾È ÇÏ¸é ¿¹»óÄ¡ ¸øÇÑ °á°ú°¡ ³ª¿Ã ¼ö ÀÖ½À´Ï´Ù. ¿¹ 7-5, ¿¹ 16-2, ¿¹ 9-5¸¦ Âü°íÇϼ¼¿ä.

½ºÅ©¸³Æ®ÀÇ ¼ÒÀ¯ÀÚ°¡ ½ºÅ©¸³Æ®¿¡¼­ ¾²ÀÌ´Â ¸í·É¾î¿¡ ´ëÇÑ ½ÇÇà ±ÇÇÑÀÌ ¾ø¾î¼­ ±× ¸í·É¾î¸¦ ½ÇÇà½ÃÅ°Áö ¸øÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¸í·É¾î ÁÙ¿¡¼­ ½ÇÇà ½ÃÅ°Áö ¸øÇÏ´Â ¸í·É¾î´Â ½ºÅ©¸³Æ®¿¡¼­ ½ÇÇà½ÃŲ´Ù Çصµ ¿ª½Ã ½ÇÆÐÇÒ °ÍÀÔ´Ï´Ù. ÇØ°áÃ¥Àº, ¹®Á¦°¡ µÇ´Â ¸í·É¾îÀÇ ¼Ó¼ºÀ» ¹Ù²ãº¸´Âµ¥, Á¤ ¾È µÇ¸é suid ºñÆ®¸¦ ¼³Á¤ÇØ º¸±â ¹Ù¶ø´Ï´Ù.(´ç¿¬È÷ ·çÆ®·Î Çؾ߰ÚÁÒ).

- ¸¦ ÀçÁöÇâ ¿¬»êÀÚ(½ÇÀº ¾Æ´ÏÁö¸¸)ó·³ ¾²·Á°í ÇÏ¸é º¸ÅëÀº ÀÌ»óÇÑ °á°ú¸¦ °¡Á®¿É´Ï´Ù.
command1 2> - | command2  # command1ÀÇ ¿¡·¯ Ãâ·ÂÀ» ÆÄÀÌÇÁ
·Î ÀçÁöÇâ ÇÏ·Á°í ÇÏÁö¸¸...
#    ...Á¦´ë·Î µ¿ÀÛÇÏÁö ¾ÊÀ» °Ì´Ï´Ù.

command1 2>& - | command2  # ¿ª½Ã ½ÇÆÐÇÕ´Ï´Ù.

Thanks, S.C.

Bash ¹öÀü 2 À̻󿡸¸ µé¾î ÀÖ´Â ±â´ÉÀº ¿¡·¯ ¸Þ¼¼Áö¸¦ ³»¸é¼­ ½ÇÆÐÇÒ °æ¿ì°¡ ÀÖ½À´Ï´Ù. ¿À·¡µÈ ¸®´ª½º ¸Ó½ÅÀÇ °æ¿ì¿¡´Â ±âº» ¼³Ä¡½Ã Bash ¹öÀü 1.XX ´ë°¡ ±ò·Á ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.
#!/bin/bash

minimum_version=2
# Chet Ramey °¡ Bash ¿¡ ±â´ÉÀ» °è¼Ó Ãß°¡ÇÏ°í Àֱ⠶§¹®¿¡
# $minimum_version À» 2.XX ³ª Àû´çÇÑ ¹öÀüÀ¸·Î ¼¼Æ®ÇÏ¸é µË´Ï´Ù.
E_BAD_VERSION=80

if [ "$BASH_VERSION" \< "$minimum_version" ]
then
  echo "ÀÌ ½ºÅ©¸³Æ®´Â Bash ¹öÀü $minimum_version À̳ª ±× À̻󿡼­¸¸ µ¿ÀÛÇÕ´Ï´Ù."
  echo "Bash ¸¦ ¾÷±×·¹À̵åÇÒ °ÍÀ» °­·ÂÈ÷ ÃßõÇÕ´Ï´Ù."
  exit $E_BAD_VERSION
fi

...

¸®´ª½º ¸Ó½ÅÀÌ ¾Æ´Ñ °÷ÀÇ º» ½© ½ºÅ©¸³Æ®(#!/bin/sh)¿¡¼­ Bash Àü¿ë ±â´ÉÀ» ¾²°Ô µÇ¸é ¿¹»óÄ¡ ¸øÇÑ µ¿ÀÛÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸®´ª½º¿¡¼­´Â shÀÌ º¸Åë bash¸¦ ³ªÅ¸³»Áö¸¸ ÀϹÝÀûÀÎ À¯´Ð½º¿¡¼­µµ Ç×»ó ÀÌ·¸Áö´Â ¾Ê½À´Ï´Ù.

µµ½º ÇüÅÂÀÇ ´º¶óÀÎ(\r\n)À¸·Î µÈ ½ºÅ©¸³Æ®´Â ½ÇÇàµÇÁö ¾Ê´Âµ¥, #!/bin/bash\r\nÀÌ ¿ì¸®°¡ ¿øÇÏ´Â #!/bin/bash\n°ú °°Áö ¾Ê¾Æ¼­ ÀνÄÇÒ ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù. ÀÌ·² ¶§´Â ±× ½ºÅ©¸³Æ®°¡ À¯´Ð½º ½ÄÀÇ ´º¶óÀÎÀ» °®µµ·Ï º¯È¯ÇØ Áà¾ß ÇÕ´Ï´Ù.

½ºÅ©¸³Æ® Çì´õ°¡ #!/bin/shÀ̶ó°í µÇ¾î ÀÖÀ¸¸é ¿ÏÀüÇÑ Bash ȣȯ ¸ðµå·Î µ¿ÀÛÇÏÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ¸î¸î Bash Àü¿ë ±â´ÉµéÀ» ¸ø ¾µ ¼öµµ ÀÖ½À´Ï´Ù. ¿ÏÀüÇÑ Bash Àü¿ë È®Àå ±â´ÉÀ» ¾²°í ½ÍÀº ½ºÅ©¸³Æ®´Â Çì´õ¸¦ #!/bin/bash¶ó°í ÇØ ÁÖ¸é µË´Ï´Ù.

½ºÅ©¸³Æ®´Â º¯¼ö¸¦ Àڱ⠺θð ÇÁ·Î¼¼½º³ª ½©, ȯ°æÀ¸·Î export ÇÒ ¼ö ¾ø½À´Ï´Ù. ¿ì¸®°¡ »ý¹°ÇÐ ½Ã°£¿¡ ¹è¿üµíÀÌ ÀÚ½ÄÀº ºÎ¸ð¿¡°Ô¼­ ¹°·Á ¹ÞÁö¸¸ ±× ¹Ý´ë´Â ¾È µË´Ï´Ù.
WHATEVER=/home/bozo
export WHATEVER
exit 0
bash$ echo $WHATEVER

bash$ 
¿ª½Ã, ¸í·É¾î ÇÁ·ÒÇÁÆ®·Î µ¹¾Æ°¡¼­ º¸¸é $WHATEVER´Â ¼¼Æ®µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.

¼­ºê½© ¾È¿¡¼­ º¯¼ö¸¦ ¼¼Æ®ÇÏ°í Á¶ÀÛÇÑ ´ÙÀ½ ¼­ºê½© ¹Ù±ù¿¡¼­ ¶È°°Àº º¯¼ö¸¦ »ç¿ëÇÏ·Á°í ÇÑ´Ù¸é º°·Î À¯ÄèÇÏÁö ¾ÊÀº °á°ú¸¦ °¡Á® ¿É´Ï´Ù.

¿¹ 32-1. ¼­ºê½© ÇÔÁ¤(Subshell Pitfalls)

#!/bin/bash
# ¼­ºê½© º¯¼öÀÇ ÇÔÁ¤.

outer_variable=outer
echo
echo "outer_variable = $outer_variable"
echo

(
# ¼­ºê½© ½ÃÀÛ

echo "¼­ºê½© ¾È¿¡¼­ÀÇ outer_variable = $outer_variable"
inner_variable=inner  # ¼Â
echo "¼­ºê½© ¾È¿¡¼­ÀÇ inner_variable = $inner_variable"
outer_variable=inner  # º¯¼ö°ª º¯°æÀÌ Àü¿ªÀûÀ¸·Î ¿µÇâÀ» ¹ÞÀ»±î¿ä?
echo "¼­ºê½© ¾È¿¡¼­ÀÇ outer_variable = $outer_variable"

# ¼­ºê½© ³¡
)

echo
echo "¼­ºê½© ¹Û¿¡¼­ÀÇ inner_variable = $inner_variable"  # ¾ð¼Â.
echo "¼­ºê½© ¹Û¿¡¼­ÀÇ outer_variable = $outer_variable"  # ¾È º¯ÇßÁÒ.
echo

exit 0

½ºÅ©¸³Æ® ¾È¿¡¼­ "suid" ¸í·É¾î¸¦ ¾²¸é ½Ã½ºÅÛ º¸¾ÈÀ» À§ÇùÇÒ ¼ö ÀÖ½À´Ï´Ù. [1]

½© ½ºÅ©¸³Æ®¸¦ CGI ÇÁ·Î±×·¡¹Ö¿¡ ¾²´Â °ÍÀº ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ½© ½ºÅ©¸³Æ® º¯¼ö´Â "ŸÀÔ ¼¼ÀÌÇÁ"(typesafe)ÇÏÁö ¾Ê±â ¶§¹®¿¡ CGI¿¡ ´ëÇؼ­¸¸Àº ¿øÇÏ´Â °á°ú¸¦ °¡Á® ¿ÀÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. °Ô´Ù°¡ "Å©·¡Ä¿ ´ëÇؼ­ ¾ÈÀüÇÑ"(cracker-proof) ½© ½ºÅ©¸³Æ®¸¦ Â¥´Â °ÍÀº ±²ÀåÈ÷ ¾î·Æ½À´Ï´Ù.

 

Danger is near thee --

Beware, beware, beware, beware.

Many brave hearts are asleep in the deep.

So beware --

Beware.

 A.J. Lamb and H.W. Petrie

ÁÖ¼®

[1]

½ºÅ©¸³Æ®¿¡ suid ¼ÒÀ¯±ÇÀ» °Å´Â °ÍÀº ¹«ÀÇ¹Ì ÇÕ´Ï´Ù.