2Àå. #! À¸·Î ½ÃÀÛÇϱâ

Â÷·Ê
2.1. ½ºÅ©¸³Æ® ½ÇÇàÇϱâ
2.2. ¸öÇ®±â ¿¬½À¹®Á¦(Preliminary Exercises)

½© ½ºÅ©¸³Æ®ÀÇ °¡Àå °£´ÜÇÑ ¿¹´Â ½ºÅ©¸³Æ® ÆÄÀÏ¿¡ ½Ã½ºÅÛ ¸í·É¾îµéÀ» ´Ü¼øÈ÷ ³ª¿­ÇØ ³õ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¸°Ô Çϸé Àû¾îµµ, ƯÁ¤ÇÑ ¼ø¼­·Î ¸í·É¾î¸¦ ½ÇÇà½ÃÄÑ¾ß ÇÒ ¶§ ´Ù½Ã Ä¡´Â ¼ö°í¸¦ ´ú¾î ÁÝ´Ï´Ù.

¿¹ 2-1. cleanup: /var/log ¿¡ ÀÖ´Â ·Î±× ÆÄÀϵéÀ» û¼ÒÇÏ´Â ½ºÅ©¸³Æ®

# cleanup
# ·çÆ®·Î ½ÇÇà½ÃŰ¼¼¿ä.

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "·Î±×¸¦ Á¤¸®Çß½À´Ï´Ù."

º° ´Ù¸¥°Ô ¾øÁÒ? ´Ü¼øÈ÷ ÄܼÖÀ̳ª ÇÑÅÒ¿¡¼­ ½±°Ô ½ÇÇà ½Ãų ¼ö ÀÖ´Â ¸í·É¾îµéÀÇ Á¶ÇÕÀÔ´Ï´Ù. ¸í·É¾îµéÀ» ½ºÅ©¸³Æ® »ó¿¡¼­ ½ÇÇà½ÃŰ´Â °ÍÀº À̵éÀ» ´Ù½Ã Ä¡Áö ¾Ê¾Æµµ µÈ´Ù´Â °Í ÀÌ»óµµ ÀÌÇϵµ ¾Æ´Õ´Ï´Ù. ½ºÅ©¸³Æ®´Â ƯÁ¤ÇÑ ÀÀ¿ë¿¡ ´ëÇØ ½±°Ô °íÄ¡°í ÀÔ¸À¿¡ ¸Â°Ô ¼öÁ¤Çϰí ÀϹÝÈ­ ½Ãų ¼ö ÀÖ½À´Ï´Ù.

¿¹ 2-2. cleanup: À§ ½ºÅ©¸³Æ®ÀÇ Çâ»óµÇ°í ÀϹÝÈ­µÈ ¹öÀü.

#!/bin/bash
# cleanup, version 2
# ·çÆ®·Î ½ÇÇà½ÃŰ¼¼¿ä.

LOG_DIR=/var/log
ROOT_UID=0     # $UID°¡ 0ÀÎ À¯Àú¸¸ÀÌ ·çÆ® ±ÇÇÑÀ» °®½À´Ï´Ù.
LINES=50       # ±âº»ÀûÀ¸·Î ÀúÀåÇÒ ÁÙ ¼ö.
E_XCD=66       # µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø´Ù?
E_NOTROOT=67   # ·çÆ®°¡ ¾Æ´Ò °æ¿ìÀÇ Á¾·á ¿¡·¯.


if [ "$UID" -ne "$ROOT_UID" ]
then
  echo "ÀÌ ½ºÅ©¸³Æ®´Â ·çÆ®·Î ½ÇÇà½ÃÄÑ¾ß µË´Ï´Ù."
  exit $E_NOTROOT
fi  

if [ -n "$1" ]
# ¸í·É¾îÁÙ ÀÎÀÚ°¡ Á¸ÀçÇÏ´ÂÁö Å×½ºÆ®(non-empty).
then
  lines=$1
else  
  lines=$LINES # ¸í·É¾îÁÙ¿¡¼­ ÁÖ¾îÁöÁö ¾Ê¾Ò´Ù¸é µðÆúÆ®°ªÀ» ¾¸.
fi  


#  Stephane Chazelas °¡ ¸í·É¾îÁÙ ÀÎÀÚ¸¦ È®ÀÎÇÏ´Â ´õ ÁÁÀº ¹æ¹ýÀ»
#+ Á¦¾ÈÇØ ÁÖ¾ú´Âµ¥ Áö±Ý ´Ü°è¿¡¼­´Â ¾à°£ ¾î·Á¿î ÁÖÁ«´Ï´Ù.
#
#    E_WRONGARGS=65  # ¼ýÀÚ°¡ ¾Æ´Ñ ÀÎÀÚ.(Ʋ¸° ÀÎÀÚ Æ÷¸Ë)
#
#    case "$1" in
#    ""      ) lines=50;;
#    *[!0-9]*) echo "»ç¿ë¹ý: `basename $0` Á¤¸®ÇÒÆÄÀÏ"; exit $E_WRONGARGS;;
#    *       ) lines=$1;;
#    esac
#
#* À̰ÍÀ» ÀÌÇØÇÏ·Á¸é "·çÇÁ" ÀýÀ» Âü°íÇϼ¼¿ä.


cd $LOG_DIR

if [ `pwd` != "$LOG_DIR" ]  # ȤÀº    if [ "$PWD" != "LOG_DIR" ]
                            # /var/log ¿¡ ÀÖÁö ¾Ê´Ù?
then
  echo "$LOG_DIR ·Î ¿Å°Ü°¥ ¼ö ¾ø½À´Ï´Ù."
  exit $E_XCD
fi  # ·Î±×ÆÄÀÏÀÌ µÚÁ×¹ÚÁ׵DZâ Àü¿¡ ¿Ã¹Ù¸¥ µð·ºÅ丮¿¡ ÀÖ´ÂÁö µÎ¹ø È®ÀÎÇÔ.

# ´õ ÁÁÀº ¹æ¹ýÀº:
# ---
# cd /var/log || {
#   echo "ÇÊ¿äÇÑ µð·ºÅ丮·Î ¿Å°Ü°¥ ¼ö ¾ø½À´Ï´Ù." >&2
#   exit $E_XCD;
# }




tail -$lines messages > mesg.temp # message ·Î±× ÆÄÀÏÀÇ ¸¶Áö¸· ºÎºÐÀ» ÀúÀå.
mv mesg.temp messages             # »õ ·Î±× ÆÄÀÏÀÌ µÊ.


# cat /dev/null > messages
#* À§ÀÇ ¹æ¹ýÀÌ ´õ ¾ÈÀüÇϴϱî ÇÊ¿ä ¾øÀ½.

cat /dev/null > wtmp  # > wtemp   ¶ó°í ÇØµµ °°Àº °á°ú.
echo "·Î±×°¡ Á¤¸®µÆ½À´Ï´Ù."

exit 0
#  ½ºÅ©¸³Æ® Á¾·á½Ã¿¡ 0À» ¸®ÅÏÇϸé
#+ ½©¿¡°Ô ¼º°øÇß´Ù°í ¾Ë·ÁÁÜ.

½Ã½ºÅÛ ·Î±× Àüü¸¦ ³¯·Á ¹ö¸± »ý°¢ÀÌ ¾øÀ» Å×´Ï±î ¿©±â¼­´Â message ·Î±×ÀÇ ¸¶Áö¸· ºÎºÐÀ» ±×´ë·Î ³²°Ü ³õ½À´Ï´Ù. ¾ÕÀ¸·Î´Â ÀÌ·¸°Ô ¾Õ¼­ ½è´ø ½ºÅ©¸³Æ®¸¦ °¡°øÇؼ­ ´Ù½Ã ¾²´Â ½ÄÀÇ Á» ´õ È¿°úÀûÀÎ ¹æ¹ýÀ» °è¼Ó º¸°Ô µÉ °ÍÀÔ´Ï´Ù.

The #! Àº ½ºÅ©¸³Æ®ÀÇ Á¦ÀÏ ¾Õ¿¡¼­ ÀÌ ÆÄÀÏÀÌ ¾î¶² ¸í·É¾î ÇØ¼®±âÀÇ ¸í·É¾î ÁýÇÕÀÎÁö¸¦ ½Ã½ºÅÛ¿¡°Ô ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. #! Àº µÎ ¹ÙÀÌÆ® [1] ÀÇ "¸ÅÁ÷ ³Ñ¹ö"(magic number)·Î¼­, ½ÇÇà °¡´ÉÇÑ ½© ½ºÅ©¸³Æ®¶ó´Â °ÍÀ» ³ªÅ¸³»´Â Ưº°ÇÑ Ç¥½ÃÀÚÀÔ´Ï´Ù(man magicÀ» Çϸé Àç¹ÌÀÖ´Â ÁÖÁ¦ÀÇ À̾߱âµéÀ» º¼ ¼ö ÀÖ½À´Ï´Ù). #! ¹Ù·Î µÚ¿¡ ³ª¿À´Â °ÍÀº °æ·Î¸íÀ¸·Î, ½ºÅ©¸³Æ®¿¡ µé¾îÀÖ´Â ¸í·É¾îµéÀ» ÇØ¼®ÇÒ ÇÁ·Î±×·¥ÀÇ À§Ä¡¸¦ ³ªÅ¸³»´Âµ¥ ±× ÇÁ·Î±×·¥ÀÌ ½©ÀÎÁö, ÇÁ·Î±×·¥ ¾ð¾îÀÎÁö, À¯Æ¿¸®Æ¼ÀÎÁö¸¦ ³ªÅ¸³À´Ï´Ù. ÀÌ ¸í·É¾î ÇØ¼®±â°¡ ÁÖ¼®Àº ¹«½ÃÇϸ鼭 ½ºÅ©¸³Æ®ÀÇ Ã¹ ¹øÂ° ÁÙºÎÅÍ ¸í·É¾îµéÀ» ½ÇÇà½Ãŵ´Ï´Ù. [2]

#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f

°¢°¢ÀÇ ÁÙÀº ±âº» ½©ÀÎ /bin/shÀ̳ª ±âº»½©(¸®´ª½º¿¡¼­´Â bash), ȤÀº ´Ù¸¥ ¸í·É¾î ÇØ¼®±â¸¦ ºÎ¸£°í ÀÖ½À´Ï´Ù. [3] °ÅÀÇ ´ëºÎºÐÀÇ »ó¾÷¿ë À¯´Ð½º º¯Á¾¿¡¼­ ±âº» º»½©ÀÎ #!/bin/shÀ» ¾²¸é ºñ·Ï Bash ¸¸ °¡Áö°í ÀÖ´Â ¸î¸î ±â´ÉµéÀ» ¸ø ¾²°Ô µÇ°ÚÁö¸¸ ¸®´ª½º°¡ ¾Æ´Ñ ´Ù¸¥ ¸Ó½Å¿¡ ½±°Ô À̽Ä(port)ÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù(ÀÌ·¸°Ô ÀÛ¼ºµÈ ½ºÅ©¸³Æ®´Â POSIX [4] sh Ç¥ÁØÀ» µû¸£°Ô µË´Ï´Ù.

"#!" µÚ¿¡ ³ª¿À´Â °æ·Î´Â Á¤È®ÇØ¾ß ÇÕ´Ï´Ù. ¸¸¾à À̸¦ Ʋ¸®°Ô Àû´Â´Ù¸é ½ºÅ©¸³Æ®¸¦ µ¹·ÈÀ» ¶§ °ÅÀÇ ´ëºÎºÐ "Command not found"¶ó´Â ¿¡·¯ ¸Þ¼¼Áö¸¸ º¸°Ô µÉ °ÍÀÔ´Ï´Ù.

½ºÅ©¸³Æ®¿¡¼­ ³»ºÎ ½© Áö½ÃÀÚ¸¦ ¾È ¾²°í ÀϹÝÀûÀÎ ½Ã½ºÅÛ ¸í·Éµé¸¸ ¾´´Ù¸é #!´Â ¾È ½áµµ ±¦Âú½À´Ï´Ù. À§ÀÇ 2¹ø ¿¹Á¦¿¡¼­´Â #!ÀÌ ÇÊ¿äÇѵ¥, lines=50À̶ó´Â ½© Àü¿ë »ý¼ºÀÚ¸¦ ½á¼­ º¯¼ö¿¡ °ªÀ» ´ëÀÔÇϰí Àֱ⠶§¹®ÀÔ´Ï´Ù. #!/bin/shÀÌ ¸®´ª½º¿¡¼­ ±âº» ½© ÇØ¼®±âÀÎ /bin/bashÀ» ºÎ¸£°í ÀÖ´Â °Í¿¡ ÁÖÀÇÇϽʽÿÀ.

Áß¿ä: ÀÌ Æ©Å丮¾óÀº ½ºÅ©¸³Æ®¸¦ ¸¸µé ¶§ ¸ðµâº° Á¢±Ù ¹æ½ÄÀ» »ç¿ëÇϵµ·Ï À¯µµÇÕ´Ï´Ù. ³ªÁß¿¡ À¯¿ëÇÏ°Ô ¾µ ¼ö ÀÖ¾î º¸À̰í "ÀÚÁÖ µîÀå"(boilerplate)ÇÏ´Â ÄÚµå Á¶°¢µéÀ» ¸ð¾Æ µÎ¼¼¿ä. ÀÌ·¸°Ô ¸ð¾ÆµÎ¸é ³ªÁß¿¡ ¾ÆÁÖ ´Ù¾çÇÏ°í ¸Å·ÂÀûÀÎ ·çƾµéÀ» ¸¸µé ¼ö ÀÖÀ» °Ì´Ï´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ ½ºÅ©¸³Æ® Á¶°¢Àº ½ºÅ©¸³Æ® ½ÃÀÛ ºÎºÐ¿¡ µÎ¾î¼­ ¿øÇÏ´Â ¼ö ¸¸Å­ÀÇ ¸Å°³º¯¼ö¸¦ ¹Þ¾Ò´ÂÁö È®ÀÎÇϴµ¥ ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù.
if [ $# -ne ¿øÇÏ´Â_¸Å°³º¯¼ö_°¹¼ö ]
then
  echo "»ç¿ë¹ý: `basename $0` ¾î¼±¸Àú¼±¸"
  exit $WRONG_ARGS
fi

ÁÖ¼®

[1]

¸î¸î À¯´Ð½º ¹öÀü(4.2BSD ¿¡ ±â¹ÝÇÑ)¿¡¼­´Â ¸ÅÁ÷ ³Ñ¹ö·Î 4 ¹ÙÀÌÆ®¸¦ ¹Þ¾ÆµéÀ̱⠶§¹®¿¡ ! ´ÙÀ½¿¡ ºó Ä­ÀÌ ÇÊ¿äÇÕ´Ï´Ù. #! /bin/sh.

[2]

ÇØ´ç ¸í·É¾î ÇØ¼®±â(shÀ̳ª bash)´Â #!ÀÌ ÀÖ´Â ÁÙÀ» óÀ½ ÇØ¼®ÇÏ·Á°í ÇÒÅÙµ¥, ÀÌ ÁÙÀº ÀÌ¹Ì ¸í·É¾î ÇØ¼®±â¸¦ ºÎ¸£´Â ÀÚ½ÅÀÇ ¿ªÇÒÀ» ¼öÇàÇß°í #À¸·Î ½ÃÀÛÇϱ⠶§¹®¿¡ ÁÖ¼®À¸·Î ¿Ã¹Ù¸£°Ô ÇØ¼®µÉ °ÍÀÔ´Ï´Ù.

[3]

±×·¡¼­ ÀÌ·¸°Ô ¸ÚÁø Æ®¸¯µµ °¡´ÉÇØ Áý´Ï´Ù.

#!/bin/rm
# ÀÚ±â ÀÚ½ÅÀ» Áö¿ì´Â ½ºÅ©¸³Æ®.

# ÀÌ ½ºÅ©¸³Æ®¸¦ ½ÇÇà½Ã۸é ÀÌ ÆÄÀÏÀÌ Áö¿öÁö´Â °Í ¸»°í´Â ¾Æ¹«Àϵµ ¾È »ý±é´Ï´Ù.

WHATEVER=65

echo "È®½ÅÇϰǵ¥, ÀÌ ºÎºÐÀº Àý´ë Ãâ·ÂµÇÁö ¾ÊÀ» °Ì´Ï´Ù."

exit $WHATEVER  # ¿©±â¼­ exit·Î ºüÁ® ³ª°¡Áö ¸øÇÏ´Ï±î ¹¹¶ó°í Àûµç »ó°ü¾ø°ÚÁÒ.

Àç¹ÌÀÖ´Â°Ô ¶Ç Àִµ¥, README ÆÄÀÏÀÇ ½ÃÀÛ ºÎºÐ¿¡ #!/bin/more ¶ó°í Àû°í ½ÇÇà ÆÛ¹Ì¼ÇÀ» ÁÖ¸é, Àڱ⠽º½º·Î ³»¿ëÀ» º¸¿©ÁÖ´Â ¹®¼­ ÆÄÀÏÀÌ µË´Ï´Ù.

[4]

Portable Operating System Interface, À¯´Ð½º·ùÀÇ OSµéÀ» À§ÇÑ Ç¥ÁØÈ­ ÀÛ¾÷