· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Yong Ki/Abs Guide


1. µé¾î°¡¸é¼­

½©(shell)À̶ó´Â °Ç ÀÏÁ¾ÀÇ ¸í·É Çؼ®±âÀÔ´Ï´Ù. OS Ä¿³Î°ú »ç¿ëÀÚ »çÀÌÀÇ Áß°£ÀÚÀû ¿ªÇÒ ÀÌ»óÀ¸·Î ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î¼­ÀÇ ±â´É ¶ÇÇÑ °­·ÂÇÏÁÒ. ½ºÅ©¸³Æ®(script)¶ó°íÇÏ´Â ½© ÇÁ·Î±×·¥Àº ½Ã½ºÅÛ ÄÝ, À¯Æ¿¸®Æ¼, ÀÌÁøÆÄÀÏ µîÀ» ¼­·Î ºÙÀÌ°í ¿¬°áÇؼ­ ¼Õ½±°Ô ÀÀ¿ëÇÁ·Î±×·¥À» °³¹ßÇϵµ·Ï µµ¿ÍÁÖ´Â ÅøÀ̶ó°í º¸½Ã¸é µË´Ï´Ù. »ç½Ç»ó ¸ðµç UNIX ¸í·É¾î, À¯Æ¿¸®Æ¼, Åø µîÀÌ ½ºÅ©¸³Æ®ÀÇ Àç·á°¡ µÉ ¼ö ÀÖ½À´Ï´Ù¸¸ ÀÌ°ÍÀ¸·Îµµ ÃæºÐÄ¡ ¾Ê´Ù¸é ½© ³»ºÎÀÇ Á¶°Ç¹®, ¹Ýº¹¹® µî ¿©·¯ ±¸¹®µéÀ» ¾²½Å´Ù¸é ½ºÅ©¸³Æ®°¡ Á»´õ °­·ÂÇÏ°í À¯¿¬ÇØÁö°Ú³×¿ä. ½© ½ºÅ©¸³Æ®´Â ½Ã½ºÅÛ °ü¸®(admin) ÀÛ¾÷À̳ª µ¢Ä¡ Å« ÇÁ·Î±×·¡¹Ö ¾ð¾î±îÁö´Â ÇÊ¿äÇÏÁö ¾ÊÀº ·çƾ ¹Ýº¹ÀûÀÎ ÀÛ¾÷¿¡ ƯÈ÷ ´É·ÂÀ» ¹ßÈÖÇÕ´Ï´Ù.

1.1. ¿Ö ½© ÇÁ·Î±×·¡¹ÖÀΰ¡?

¼÷·ÃµÈ ½Ã½ºÅÛ °ü¸®ÀÚ¿¡°Ô À־ ½© ½ºÅ©¸³Æà Áö½ÄÀº ÇʼöÀÔ´Ï´Ù. ½ºÅ©¸³Æ® ÀÛ¼ºÇÒ ÀÏÀÌ ¾ø´Ù°í »ý°¢ÇÏ´Â °ü¸®ÀÚ¿¡°Ôµµ ¿¹¿Ü¾øÁÒ. ¾Æ½Ã´Ù½ÃÇÇ ¸®´ª½º ½Ã½ºÅÛÀÌ ºÎÆÃÇÒ ¶§ /etc/rc.d ¿¡ ÀÖ´Â ½ºÅ©¸³Æ®µéÀ» ½ÇÇàÇؼ­ ½Ã½ºÅÛ ¼³Á¤À» º¹¿øÇÏ°í ¼­ºñ½ºµéÀ» ¼¼ÆÃÇÕ´Ï´Ù. ½Ã½ºÅÛÀÇ µ¿Å¸¦ ºÐ¼®ÇÏ°í ¼öÁ¤ÇÏ·Á¸é ÀÌ·± ½Ãµ¿(startup) ½ºÅ©¸³Æ®µéÀ» ¼¼ºÎÀûÀ¸·Î ÀÌÇØÇؾ߰ÚÁÒ.

½© ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ´Â °ÍÀº ±×¸® ¾î·ÆÁö ¾Ê½À´Ï´Ù. ½ºÅ©¸³Æ®´Â ÇÑÀ԰Ÿ®ÀÇ ºÎºÐµé·Î Â¥Áý±â µÇ¾î ÀÖ°í ½© °íÀ¯ÀÇ ¿¬»êÀÚ³ª ¿É¼Çµé[1]µµ ¸¹Áö ¾Ê±â ¶§¹®ÀÌÁÒ. ¹®¹ýµµ ´Ü¼øÇÏ°í Á÷°üÀûÀÌ¸ç ¸í·ÉÇà »ó¿¡¼­ À¯Æ¿¸®Æ¼µéÀ» ½ÇÇàÇÏ°í ¿¬°áÇÏ´Â ¹æ½Ä°ú ºñ½ÁÇÕ´Ï´Ù. ÀÍÇô¾ß ÇÒ ±ÔÄ¢(rule)µµ ±×¸® ¸¹Áö ¾Ê¾Æ¿ä.

º¹ÀâÇÑ ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ÇÁ·ÎÅäŸÀÔ(prototype)À» ÀÛ¼ºÇÏ´Â µ¥ "quick and dirty"ÇÑ ¹æ¹ýÀ¸·Î ½© ½ºÅ©¸³Æ®°¡ ÀÌ¿ëµÇ±âµµ ÇÕ´Ï´Ù. ÇÁ·ÎÁ§Æ® °³¹ßÀÇ Ã¹ ´Ü°è·Î¼­ ºÎºÐÀûÀ¸·Î ±â´ÉÀ» ±¸ÇöÇÏ´Â µ¥ ½©½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇÏ¿© Å×½ºÆ®Çϸ鼭 C, C++, Java ³ª Perl µîÀ¸·Î ÃÖÁ¾ ÄÚµùµÇ±â Àü¿¡ ·çƾÀÇ ±¸Á¶Àû ȤÀº ³í¸®Àû °áÇÔÀÌ ¹ß°ßµÇÁÒ.

½© ½ºÅ©¸³ÆÃÀº º¹ÀâÇÑ ÇÁ·ÎÁ§Æ®´Â ´õ ´Ü¼øÇÑ ¿ä¼Òµé·Î ³ª´²¼­ ÀÛ¾÷ÇÏ°í ´Ù½Ã °áÇÕÇÑ´Ù´Â °íÀüÀûÀÎ UNIX öÇÐÀ» Àß ÀÌÇàÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ¸¹Àº »ç¶÷µéÀÌ Â÷¼¼´ëÀÇ ¿ÃÀοø(all-in-one) °í±Þ ¾ð¾î¸¦ »ç¿ëÇÏ´Â °Íº¸´Ù´Â ÀÌ·¯ÇÑ ¹æ½ÄÀÌ ´õ ÁÁ°Å³ª ¸Å·ÂÀûÀ̶ó°í »ý°¢ÇÏÁÒ. ¸ðµç »ç¶÷¿¡°Ô ¸ðµç ÀÏÀÌ °¡´ÉÇϵµ·Ï ±âȹµÈ ±×·± ¾ð¾î¸¦ »ç¿ëÇÏ·Á¸é ÀÚ½ÅÀÇ »ç°í¹æ½Ä°ú ÀýÂ÷¸¦ ±× µµ±¸¿¡ ¸Â°Ô °íÃÄ¾ß ÇÏ´Â ºÎ´ãÀº °¨¼öÇØ¾ß ÇÕ´Ï´Ù.

´ÙÀ½ÀÇ ÀÛ¾÷À» ÇÒ »ý°¢À̶ó¸é ½© ½ºÅ©¸³Æ®´Â Àû´çÇÏÁö ¾Ê½À´Ï´Ù.
  • ÀÚ¿ø(resource)Áý¾àÀûÀÎ ÀÛ¾÷ : ƯÈ÷ ¼Óµµ°¡ »ý¸íÀÎ ÀÛ¾÷ (Sorting, Hashing µî)
  • Áß¿äÇÑ ¼öÄ¡ ¿¬»ê : ƯÈ÷ ºÎµ¿ ¼Ò¼öÁ¡, ÀÓÀÇÀÇ Á¤¹Ðµµ, º¹¼Ò¼ö °è»ê µî (C++ À̳ª Æ÷Æ®¶õÀ» ¾²¼¼¿ä)
  • Ç÷§Æû°£ À̽ļºÀÌ ¿ä±¸µÇ´Â ÀÛ¾÷ (C¸¦ ¾²¼¼¿ä)
  • ±¸Á¶È­µÈ ÇÁ·Î±×·¡¹ÖÀÌ ÇÊ¿äÇÑ ÀÛ¾÷ (ÇÔ¼öÇü, º¯¼öÇü µîÀ» È®ÀÎÇØ¾ß ÇÏ´Â ÀÛ¾÷)
  • ȸ»çÀÇ ¹Ì·¡°¡ °É·ÁÀÖ´Â Áß´ëÇÑ ÀÀ¿ëÇÁ·Î±×·¥
  • º¸¾ÈÀÌ Áß¿ä½ÃµÇ´Â »óȲ : ½Ã½ºÅÛÀÇ ¹«°á¼ºÀ» º¸ÀåÇØ¾ß Çϰųª ÇØÅ·À̳ª Å©·¡Å·À¸·ÎºÎÅÍ º¸È£ÇØ¾ß ÇÏ´Â »óȲ
  • ±Ô¸ð°¡ Å« ÆÄÀÏ ¿¬»êÀÌ ¿ä±¸µÇ´Â ÀÛ¾÷ (Bash´Â ¿¬¼ÓÀûÀÎ ÆÄÀÏ Á¢±Ù¿¡ Á¦ÇÑÀûÀÔ´Ï´Ù)
  • ´ÙÂ÷¿ø ¹è¿­ÀÌ ÇÊ¿äÇÑ ÀÛ¾÷
  • ¿¬°á¸®½ºÆ®³ª Æ®¸® °°Àº ÀڷᱸÁ¶°¡ ÇÊ¿äÇÑ ÀÛ¾÷
  • ±×·¡ÇÈÀ̳ª GUI¸¦ »ý¼ºÇØ¾ß ÇÏ´Â ÀÛ¾÷
  • Çϵå¿þ¾î¿¡ Á÷Á¢ Á¢±ÙÇØ¾ß ÇÏ´Â ÀÛ¾÷
  • Æ÷Æ®(port)³ª ¼ÒÄÏI/O¸¦ ÇÊ¿ä·Î ÇÏ´Â ÀÛ¾÷
  • ±¸½Ä ÄÚµå·Î ¶óÀ̺귯¸®³ª ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇØ¾ß ÇÏ´Â ÀÛ¾÷
  • ¼ÒÀ¯±ÇÀÌ Àְųª ¼Ò½º°¡ °ø°³µÇ¾î¼­´Â ¾ÈµÇ´Â ÇÁ·Î±×·¥
À§ÀÇ ÀÛ¾÷À» Çؾ߰ÚÀ¸¸é Á»´õ °­·ÂÇÑ ½ºÅ©¸³Æ® ¾ð¾î(Perl, Tcl, Python, Ruby µî)³ª ÄÄÆÄÀÏ ¾ð¾î(C, C++, Java µî)¸¦ ¾²´Â°Ô ÁÁ½À´Ï´Ù. ¹°·Ð ÀÌ ¶§¿¡µµ ºÎºÐ ±â´ÉÀ» ±¸ÇöÇÏ´Â µ¥ ½© ½ºÅ©¸³Æ®·Î ÇÁ·ÎÅäŸÀÔÀ» ÀÛ¼ºÇغ¸´Â °Ç ¾µ¸ð°¡ ÀÖ°ÚÁÒ.

¿ì¸®°¡ ¾ÕÀ¸·Î ÇÔ²² ¹è¿öº¼ ½©Àº BashÀÔ´Ï´Ù. Bash´Â "Bourne-Again shell"ÀÇ ¸Ó¸´±ÛÀÚÀÌ°í Stephen BourneÀÇ Bourne Shell¿¡¼­ À¯·¡ÇßÁÒ. Bash´Â »ç½Ç»ó °ÅÀÇ ¸ðµç UNIX(-like)¿¡¼­ ½©½ºÅ©¸³ÆÃÀÇ Ç¥ÁØÀÌ µÇ¾ú½À´Ï´Ù. ¾ÕÀ¸·Î ¾ê±âÇÒ ´ëºÎºÐÀÇ ¿ø¸®µéÀº Korn Shell[2]À̳ª C Shell°ú °°Àº ´Ù¸¥ ½©¿¡¼­ÀÇ ½ºÅ©¸³Æÿ¡µµ Àû¿ëÇØ º¼ ¼ö ÀÖ¾î¿ä. (C Shell ÇÁ·Î±×·¡¹ÖÀº ÃßõÇÏÁö ¾Ê½À´Ï´Ù. 1993³â 10¿ù¿¡ Tom Christiansen ÀÌ C ShellÀÇ Å¸°í³­ °áÇÔ¿¡ ´ëÇØ À¯Áî³Ý¿¡ Æ÷½ºÆ®Çß¾ú³×¿ä.)

À̾îÁú ³»¿ëÀº ½© ½ºÅ©¸³Æà ƩÅ丮¾ó(tutorial)ÀÔ´Ï´Ù. ½©ÀÇ ´Ù¾çÇÑ Æ¯Â¡µéÀ» ¼³¸íÇϱâ À§ÇØ ¸¹Àº ¿¹Á¦µéÀ» °çµé¿´´Âµ¥ ¸î¸îÀº ±×´ë·Î °¡Á®´Ù ½áµµ À¯¿ëÇÑ °ÍµéÀÌÁÒ. ¿¹Á¦ ½ºÅ©¸³Æ®ÀÇ ¼Ò½ºÆÄÀÏ(scriptname.sh ¶Ç´Â scriptname.bash)[3]À» ½ÇÇàÇÏ·Á¸é ¸ÕÀú chmod u+rx scriptname °ú °°ÀÌ ½ÇÇàÆ۹̼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù´Â °Í ÀØÁö ¸¶¼¼¿ä.

1.2. Sha-Bang(#!)À¸·Î ½ÃÀÛÇÏÀÚ

°¡Àå °£´ÜÇÑ ½ºÅ©¸³Æ®¸¦ º¸¸é, ½ºÅ©¸³Æ®¶ó´Â °ÍÀº ½Ã½ºÅÛ ¸í·É¾îµéÀ» ÆÄÀÏ ¾È¿¡ ³ª¿­ÇÑ °Í¿¡ Áö³ªÁö ¾Ê±¸³ª ÇÏ´Â »ý°¢ÀÌ µé°Ì´Ï´Ù. ±×·¸´Ù°í Çصµ ½ÇÇàÇÒ ¶§¸¶´Ù µ¿ÀÏÇÑ ¸í·É¾îµéÀ» ´Ù½Ã ŸÀÌÇÎÇÏ´Â ¼ö°í´Â ´ú¾îÁÖ´Â °ÅÁÒ.

¿¹Á¦ 2-1. cleanup : /var/log ¾È¿¡ ÀÖ´Â ·Î±×ÆÄÀÏ Ã»¼ÒÇÏ´Â ½ºÅ©¸³Æ®
# Cleanup
# Run as root, of course.

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
º¸½Ã´Â °Íó·³ ±×¸® Ưº°ÇÑ °Ç ¾ø½À´Ï´Ù. ÄܼÖ(console)À̳ª xterm ÀÇ ¸í·ÉÇà¿¡¼­ ÇÑÁÙ ÇÑÁÙ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¸í·É¾îµéÀ» ¹­¾î³õÀº °Í »ÓÀ̴ϱî¿ä. ±×·¡µµ ÀÌ ÀÛ¾÷À» ÇÒ ¶§¸¶´Ù ´Ù½Ã ŸÀÌÇÎÇÏÁö ¾Ê¾Æµµ µÇ´Â ÀÌÁ¡ÀÌ ÀÖÀ¸´Ï ÀÌ ½ºÅ©¸³Æ®´Â ¿ì¸®¿¡°Ô À¯¿ëÇÑ ÅøÀÌ°í, ÇÊ¿ä¿¡ µû¶ó ½±°Ô ¼öÁ¤ÇÏ°í »õ·Î¿î ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿¹Á¦ 2-2. cleanup : °³¼±µÈ clean-up ½ºÅ©¸³Æ®
#!/bin/bash
# Proper header for a Bash script.

# Cleanup, version 2

# Run as root, of course.
# Insert code here to print error message and exit if not root.

LOG_DIR=/var/log
# Variables are better than hard-coded values.
cd $LOG_DIR

cat /dev/null > messages
cat /dev/null > wtmp

echo "Logs cleaned up."

exit # The right and proper method of "exiting" from a script.
ÀÌÁ¦¾ß ÁøÂ¥ ½ºÅ©¸³Æ®Ã³·³ º¸À̱⠽ÃÀÛÇϳ׿ä. Á»´õ °¡º¾½Ã´Ù...

¿¹Á¦ 2-3. cleanup : À§ ½ºÅ©¸³Æ®¸¦ °­È­ÇÏ°í ÀϹÝÈ­ÇÑ ¹öÀü
#!/bin/bash
# Cleanup, version 3

#  Warning:
#  -------
#  This script uses quite a number of features that will be explained
#+ later on.
#  By the time you've finished the first half of the book,
#+ there should be nothing mysterious about it.

LOG_DIR=/var/log
ROOT_UID=0     # Only users with $UID 0 have root privileges.
LINES=50       # Default number of lines saved.
E_XCD=66       # Can't change directory?
E_NOTROOT=67   # Non-root exit error.

# Run as root, of course.
if [ "$UID" -ne "$ROOT_UID" ]
then
  echo "Must be root to run this script."
  exit $E_NOTROOT
fi  

if [ -n "$1" ]
# Test if command line argument present (non-empty).
then
  lines=$1
else  
  lines=$LINES # Default, if not specified on command line.
fi  

#  Stephane Chazelas suggests the following,
#+ as a better way of checking command line arguments,
#+ but this is still a bit advanced for this stage of the tutorial.
#
#    E_WRONGARGS=65  # Non-numerical argument (bad arg format)
#
#    case "$1" in
#    ""      ) lines=50;;
#    *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGARGS;;
#    *       ) lines=$1;;
#    esac
#
#* Skip ahead to "Loops" chapter to decipher all this.

cd $LOG_DIR

if [ `pwd` != "$LOG_DIR" ]  # or   if [ "$PWD" != "$LOG_DIR" ]
                            # Not in /var/log?
then
  echo "Can't change to $LOG_DIR."
  exit $E_XCD
fi  # Doublecheck if in right directory, before messing with log file.

# far more efficient is:
#
# cd /var/log || {
#   echo "Cannot change to necessary directory." >&2
#   exit $E_XCD;
# }

tail -$lines messages > mesg.temp # Saves last section of message log file.
mv mesg.temp messages             # Becomes new log directory.

# cat /dev/null > messages
#* No longer needed, as the above method is safer.

cat /dev/null > wtmp  #  ': > wtmp' and '> wtmp'  have the same effect.
echo "Logs cleaned up."

exit 0
#  A zero return value from the script upon exit
#+ indicates success to the shell.
ÀÌ ¹öÀüÀº ½Ã½ºÅÛ ·Î±×¸¦ ¸ù¶¥ Áö¿ìÁö ¾Ê°í ·Î±×ÀÇ ¸¶Áö¸· ºÎºÐÀ» Á¶±Ý ³²°ÜµÓ´Ï´Ù. ÀÌÈÄ¿¡ ½ºÅ©¸³Æ® È¿À²À» ³ôÀδٵçÁö ´Ù¸¥ ÇÊ¿ä°¡ »ý±ä´ÙµçÁö ÇÒ ¶§¸¶´Ù ¿©·¯ºÐÀÌ ½ºÅ©¸³Æ®¸¦ ´Ùµë¾î °¡¼¼¿ä.

½ºÅ©¸³Æ® ¸Ç óÀ½¿¡ µîÀåÇÏ´Â sha-bang(#!)Àº ¾Æ·¡ÀÇ ½ºÅ©¸³Æ®´Â ÁöÁ¤ÇÑ ¸í·É Çؼ®±â¸¦ ÅëÇؼ­ ¼öÇàµÇ¾î¾ß ÇÑ´Ù´Â °É ½Ã½ºÅÛ¿¡ ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. #! ´Â »ç½Ç 2¹ÙÀÌÆ®[4] ¸ÅÁ÷³Ñ¹ö(magic number, ÀÚ¼¼ÇÑ ³»¿ëÀº man magicÀ» Ãĺ¸¼¼¿ä)ÀÔ´Ï´Ù. sha-bang ´ÙÀ½¿¡´Â °ð¹Ù·Î °æ·Î¸íÀÌ ¿Í¾ß Çϴµ¥, ½ºÅ©¸³Æ®¿¡ ¾²ÀÎ ¸í·ÉµéÀ» Çؼ®ÇÒ ÇÁ·Î±×·¥ °æ·ÎÀÌ°í ½©, ÇÁ·Î±×·¡¹Ö ¾ð¾î ¶Ç´Â À¯Æ¿¸®Æ¼ µîÀÌ ¿Ã ¼ö ÀÖ¾î¿ä. sha-bang¶óÀÎÀÇ ´ÙÀ½ ÁÙºÎÅʹ ȣÃâµÈ ¸í·É Çؼ®±â°¡ ¼øÂ÷ÀûÀ¸·Î 󸮸¦ ÇÏ°í, À̶§ ÁÖ¼®(comments)Àº ¹«½ÃÇÕ´Ï´Ù.[5]
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f
À§ÀÇ sha-bang¶óÀεéÀº °¢±â ´Ù¸¥ ¸í·É Çؼ®±â¸¦ È£ÃâÇϴϱî ÇÊ¿äÇÑ ´ë·Î Çϳª¸¸ ¼±ÅÃÇϼ¼¿ä. ´ëºÎºÐÀÇ »ó¾÷ÀûÀÎ UNIX·ùÀÇ ¿î¿µÃ¼Á¦¿¡¼­ ±âº»(default)À¸·Î äÅÃÇÏ°í ÀÖ´Â #!/bin/shÀ» »ç¿ëÇÑ´Ù¸é ½ºÅ©¸³Æ®¸¦ ºñ¸®´ª½º ¸Ó½Å¿¡ À̽ÄÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. ¹°·Ð Bash °íÀ¯ÀÇ Æ¯Â¡µéÀº ¸ø ¾²°ÚÁö¸¸ ½ºÅ©¸³Æ®´Â POSIX[6] shÇ¥ÁØÀ» µû¸£°Ô µÇ´Â °ÅÁÒ.

sha-bang¶óÀÎÀÇ °æ·Î¸íÀº À¯È¿ÇÑ °ÍÀ̾î¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¿¡·¯ ¸Þ¼¼Áö(º¸Åë "Command not found")¸¸ µþ¶û ³»º¸³»°Åµç¿ä.

½© ³»ºÎÀÇ ¸í·ÉµéÀ» »ç¿ëÇÏÁö ¾Ê°í ÀϹÝÀûÀÎ ½Ã½ºÅÛ ¸í·Éµé¸¸ Âß ³ª¿­ÇÑ ½ºÅ©¸³Æ®¶ó¸é(À§ÀÇ Ã¹¹ø° ¿¹Á¦Ã³·³) #!¶óÀÎÀ» »ý·«ÇÒ ¼ö ÀÖ½À´Ï´Ù. À§ÀÇ µÎ¹ø° ¿¹Á¦¿¡¼­´Â ½© °íÀ¯ÀÇ ±¸¹®ÀÎ º¯¼ö ÇÒ´ç¹®(lines=50)À» »ç¿ëÇ߱⠶§¹®¿¡ ¹Ýµå½Ã #!¶óÀÎÀ» ½á¾ß ÇÏÁÒ. ¶Ç Çϳª ¸í½ÉÇÒ °ÍÀº #!/bin/shÀº ±âº»(default) ½©À» ½ÇÇàÇÕ´Ï´Ù. ¸®´ª½º ¸Ó½Å¿¡¼­´Â /bin/bash°¡ ±âº» ½©ÀÌ¿¡¿ä.

(!) ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ½Ç ¶§ ¸ðµâ¹æ½ÄÀÇ Á¢±ÙÀ» ±ÇÀåÇÕ´Ï´Ù. ¹Ýº¹ÀûÀ¸·Î »ç¿ëµÇ´Â Å丷 ÄÚµå(snippets)´Â ³ªÁß¿¡ Àç»ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¸ð¾ÆµÎ¼¼¿ä. ÀÌ·¸°Ô ÇÏ´Ùº¸¸é ¸¶Ä§³»´Â ¸ÚÁø ¶óÀ̺귯¸®°¡ ¿Ï¼ºµÇ°ÚÁÒ. ¿¹¸¦ µé¾î, ¾Æ·¡ÀÇ Å丷 ÄÚµå´Â ½ºÅ©¸³Æ®°¡ ½ÇÇàµÉ ¶§ ³Ñ°Ü¹ÞÀº ÆĶó¸ÞÅÍ(parameter)ÀÇ ¼ö°¡ ¿Ã¹Ù¸¥Áö °Ë»çÇÏ´Â °Ì´Ï´Ù.
E_WRONG_ARGS=65
script_parameters="-a -h -m -z"
#                  -a = all, -h = help, etc.

if [ $# -ne $Number_of_expected_args ]
then
  echo "Usage: `basename $0` $script_parameters"
  # `basename $0` is the script's filename.
  exit $E_WRONG_ARGS
fi
óÀ½¿¡´Â ¿¹Á¦ 2-1ó·³ ÇÑ°¡Áö ƯÁ¤ ÀÛ¾÷¸¸ ¼öÇàÇÏ´Â ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ°ÚÁö¸¸, ³ªÁß¿¡´Â ºñ½ÁÇϰųª Á¶±Ý ´Ù¸¥ ÀÛ¾÷¿¡µµ ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ½ºÅ©¸³Æ®¸¦ ÀϹÝÈ­ÇÏ°Ô µÉ °Ì´Ï´Ù. ±×·²·Á¸é ¸ÕÀú, ¹Ýº¹µÈ Äڵ带 ÇÔ¼ö·Î ¹­´Â °Íó·³, ¹®ÀÚ »ó¼ö¸¦ º¯¼ö·Î ¹Ù²Ù¼¼¿ä. (¿¹Á¦ 2-1¿¡¼­ 2-2·Î º¯È­µÈ Á¡À» »ìÆ캸¼¼¿ä.)

1.2.1. ½ºÅ©¸³Æ® ½ÇÇàÇϱâ

½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇßÀ¸¸é sh scriptname[7]³ª bash scriptnameÀ» Ãļ­ ½ÇÇàÇØ º¸¼¼¿ä. (Not recommended is using sh chmod·Î ½ºÅ©¸³Æ®¸¦ Á÷Á¢ ½ÇÇà°¡´ÉÇÏ°Ô ¸¸µå´Â °ÍÀÌ ´õ ÆíÇÏ°ÚÁÒ.

chmod 555 scriptname (¸ðµç »ç¿ëÀÚ¿¡°Ô Àбâ/½ÇÇà Æ۹̼ÇÀ» ºÎ¿©ÇÕ´Ï´Ù.)[8]
¶Ç´Â
chmod +rx scriptname (À§¿Í °°½À´Ï´Ù.)
À̳ª
chmod u+rx scriptname (ÆÄÀÏ ¼ÒÀ¯ÀÚ¿¡°Ô¸¸ Àбâ/½ÇÇà Æ۹̼ÇÀ» ºÎ¿©ÇÕ´Ï´Ù.)


ÀÌ·¸°Ô Çϸé ./scriptname[9]¸¦ Ãļ­ ½ÇÇàÇÒ ¼ö ÀÖ¾î¿ä. ¹°·Ð, ½ºÅ©¸³Æ®°¡ sha-bang¶óÀÎÀÌ ÀÖÀ¸¸é ÁöÁ¤µÈ ¸í·É Çؼ®±â¸¦ È£ÃâÇؼ­ ½ÇÇàÇÕ´Ï´Ù.

½ºÅ©¸³Æ®ÀÇ Å×½ºÆ®¿Í µð¹ö±ëÀÌ ³¡³ª°í ¿Ï¼ºµµ°¡ ³ô¾ÆÁø ÈÄ root±ÇÇÑÀ¸·Î ½ºÅ©¸³Æ® ÆÄÀÏÀ» /usr/local/binÀ¸·Î ¿Å±â¸é, ¸í·ÉÇà¿¡¼­ scriptname¸¦ Ä¡´Â °Í¸¸À¸·Îµµ ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÒ ¼ö ÀÖ°Ô µÇ°í ´Ù¸¥ »ç¿ëÀڵ鵵 ½ºÅ©¸³Æ®¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

1.2.2. ¿¬½À ¹®Á¦

  1. ½Ã½ºÅÛ °ü¸®ÀÚµéÀº ÀÏ»óÀûÀÎ ÀÛ¾÷µéÀ» ½ºÅ©¸³Æ®·Î ¸¸µé¾î¼­ ÀÚµ¿È­ÇÏ´Â °æ¿ì°¡ ¸¹½À´Ï´Ù. ½ºÅ©¸³Æ®¸¦ ½èÀ» ¶§ À¯¿ëÇÑ ÀÛ¾÷µéÀÇ ¿¹¸¦ ¸î°¡Áö µé¾îº¸¼¼¿ä.

  2. ÇöÀç ½Ã°£°ú ³¯Â¥, ·Î±×ÀÎÇÑ »ç¿ëÀÚ ¸ñ·Ï, ½Ã½ºÅÛ °¡µ¿½Ã°£(uptime)À» Ãâ·ÂÇÏ°í ·Î±×ÆÄÀÏÀ» ³²±â´Â ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇØ º¸¼¼¿ä.

2. ±âº»±â

2.1. Ư¼ö ¹®ÀÚ

½ºÅ©¸³Æ®³ª ±âŸ °÷°÷¿¡¼­ ÀÚÁÖ º¸À̴ Ư¼ö¹®ÀÚµé

#
ÁÖ¼®(comments). # ¿¡¼­ºÎÅÍ ÁÙ ³¡±îÁö´Â ÁÖ¼®Ã³¸® ÇÕ´Ï´Ù. # ¾Õ¿¡ °ø¹éÀÌ ¿Íµµ µÇÁÒ.
# This line is a comment.
echo "A comment will follow." # Comment here.
#                            ^ Note whitespace before #
            # A tab precedes this comment.
<!> ÁÖ¼®¶óÀÎ ¾È¿¡ ¸í·É¹®À» ¾²½Ã¸é ¸¶Âù°¡Áö·Î ÁÖ½Äó¸® µÇ´Ï±î ´ÙÀ½ ¸í·É¹®Àº »õ·Î¿î ÁÙ¿¡ ¾²¼¼¿ä. #·Î Çѹø ½ÃÀÛÇÑ ÁÖ¼®¶óÀÎÀ» ±× ÁÙ¿¡¼­ Á¾·á½Ãų ¹æ¹ýÀº ¾ø½À´Ï´Ù.


(./) ¹°·Ð, echo¹®¿¡¼­ À̽ºÄÉÀÌÇÁ ó¸®ÇÑ #Àº ÁÖ¼®À¸·Î º¸Áö ¾Ê½À´Ï´Ù. ÆĶó¸ÞÅÍ Ä¡È¯½ÄÀ̳ª ¼ýÀÚ »ó¼ö Ç¥Çö½Ä, ÆÐÅÏ ¸ÅĪ ¿¬»ê¿¡¼­ ¾²ÀÌ´Â #µµ ¸¶Âù°¡ÁöÁÒ.
echo "The # here does not begin a comment."
echo 'The # here does not begin a comment.'
echo The \# here does not begin a comment.
echo The # here begins a comment.

echo ${PATH#*:}       # Parameter substitution, not a comment.
echo $(( 2#101011 ))  # Base conversion, not a comment.

# Thanks, S.C.
#¸¦ À̽ºÄÉÀÌÇÁ ó¸®ÇÏ´Â µ¥ " ' \ ¿Í °°Àº ¹®ÀÚ°¡ »ç¿ëµË´Ï´Ù.

;
¸í·É ±¸ºÐÀÚ [semicolon]. ÇÑÁÙ¿¡ µÑ ÀÌ»óÀÇ ¸í·É¹®ÀÌ °¡´ÉÇÏ°Ô ÇÏÁÒ.
echo hello; echo there

if [ -x "$filename" ]; then    # Note that "if" and "then" need separation.
                               # Why?
  echo "File $filename exists."; cp $filename $filename.bak
else
  echo "File $filename not found."; touch $filename
fi; echo "File test complete."


;;
case ±¸¹®¿¡¼­ ¼±Åù® Á¾°áÀÚ [double semicolon].
case "$variable" in
abc)  echo "\$variable = abc" ;;
xyz)  echo "\$variable = xyz" ;;
esac


.
"dot" command [period]. Equivalent to source (see Example 11-20). This is a bash builtin.

.
"dot", ÆÄÀÏ¸í¿¡¼­. ÆÄÀϸíÀÌ "."À¸·Î ½ÃÀÛÇÏ¸é ¼û±èÆÄÀÏÀÌ µË´Ï´Ù.
bash$ touch .hidden-file
bash$ ls -l	      
total 10
 -rw-r--r--    1 bozo      4034 Jul 18 22:04 data1.addressbook
 -rw-r--r--    1 bozo      4602 May 25 13:58 data1.addressbook.bak
 -rw-r--r--    1 bozo       877 Dec 17  2000 employment.addressbook


bash$ ls -al	      
total 14
 drwxrwxr-x    2 bozo  bozo      1024 Aug 29 20:54 ./
 drwx------   52 bozo  bozo      3072 Aug 29 20:51 ../
 -rw-r--r--    1 bozo  bozo      4034 Jul 18 22:04 data1.addressbook
 -rw-r--r--    1 bozo  bozo      4602 May 25 13:58 data1.addressbook.bak
 -rw-r--r--    1 bozo  bozo       877 Dec 17  2000 employment.addressbook
 -rw-rw-r--    1 bozo  bozo         0 Aug 29 20:54 .hidden-file
µð·ºÅ丮¸íÀ» ´ë½ÅÇØ ¾µ ¼öµµ Àִµ¥, "."Àº ÇöÀç µð·ºÅ丮¸¦, ".."Àº »óÀ§ µð·ºÅ丮¸¦ ÀǹÌÇÕ´Ï´Ù.
bash$ pwd
/home/bozo/projects

bash$ cd .
bash$ pwd
/home/bozo/projects

bash$ cd ..
bash$ pwd
/home/bozo/
"."Àº ÆÄÀÏÀ» À̵¿½ÃÅ°´Â ¸í·É¿¡¼­ ¸ñÀûÁö(µð·ºÅ丮)¸¦ ´ë½ÅÇؼ­ ÀÚÁÖ ¾²ÀÔ´Ï´Ù.
bash$ cp /home/bozo/current_work/junk/* .


.
"dot", Á¤±ÔÇ¥Çö½Ä¿¡¼­. Á¤±ÔÇ¥Çö½Ä¿¡¼­ "."Àº ¹®ÀÚ Çϳª¿¡ ¸ÅÄ¡µË´Ï´Ù.

"
partial quoting [double quote]. "STRING" preserves (from interpretation) most of the special characters within STRING. See also Chapter 5.

'
full quoting [single quote]. 'STRING' preserves all special characters within STRING. This is a stronger form of quoting than using ". See also Chapter 5.

,
ÄÞ¸¶(comma) ¿¬»êÀÚ. ÄÞ¸¶ ¿¬»êÀÚ´Â ÀÏ·ÃÀÇ ¼öÄ¡ ¿¬»êÀ» ¿¬°áÇÕ´Ï´Ù. ¿¬°áµÈ ¿¬»ê½Ä ¸ðµÎ¸¦ Æò°¡ÇÏÁö¸¸ ¸¶Áö¸· °Í¸¸ ¹ÝȯÇØ¿ä.
let "t2 = ((a = 9, 15 / 3))"  # Set "a = 9" and "t2 = 15 / 3"


\
À̽ºÄÉÀÌÇÁ ¹®ÀÚ [backslash]. A quoting mechanism for single characters.

\X "escapes" the character X. This has the effect of "quoting" X, equivalent to 'X'. The \ may be used to quote " and ', so they are expressed literally.

See Chapter 5 for an in-depth explanation of escaped characters

/
ÆÄÀÏ¸í °æ·Î ±¸ºÐÀÚ [forward slash]. /home/bozo/projects/Makefileó·³ ÆÄÀÏ¸í¿¡¼­ ±¸ºÐÀÚ ¿ªÇÒÀ» Çϴµ¥, »ê¼ú¿¡¼­ ³ª´°¼À ¿¬»êÀڷεµ ¾²ÀÌÁÒ.

`
command ġȯ backquote, backtick. `·Î °¨½Ñ command´Â commandÀÇ Ãâ·Â¹°À» º¯¼ö¿¡ ´ëÀÔÇÒ ¶§ ÀÌ¿ëÇÕ´Ï´Ù.

:
null command [colon]. "NOP" (no op, a do-nothing operation)¿Í °°½À´Ï´Ù. ½© ³»ÀåÀÇ true¿Í µ¿ÀǾî·Î º¸½Ã¸é µË´Ï´Ù. ":" Àº ±× ÀÚü·Î ¾²ÀÏ ¼ö ÀÖ°í exit°ªÀº "true" (0)ÀÔ´Ï´Ù.
:
echo $?   # 0
¹«ÇÑ ·çÇÁ:
while :
do
   operation-1
   operation-2
   ...
   operation-n
done

# Same as:
#    while true
#    do
#      ...
#    done
Placeholder in if/then test:
if condition
then :   # Do nothing and branch ahead
else
   take-some-action
fi
Provide a placeholder where a binary operation is expected, see Example 8-2 and default parameters.
: ${username=`whoami`}
# ${username=`whoami`}   Gives an error without the leading :
#                        unless "username" is a command or builtin...



----
  • [1] 11Àå. ³»ºÎ ¸í·É¾î¿Í ³»ÀåÇÔ¼ö ¿¡¼­ ¼³¸íÇÕ´Ï´Ù.
  • [2] Many of the features of ksh88, and even a few from the updated ksh93 have been merged into Bash.
  • [3] »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ ½ºÅ©¸³Æ®´Â È®ÀåÀÚ¸¦ .sh ·Î ÇÏ´Â °ÍÀÌ °ü·ÊÀÔ´Ï´Ù. /etc/rc.d ¿¡ ÀÖ´Â °Í°ú °°Àº ½Ã½ºÅÛ ½ºÅ©¸³Æ®´Â ÀÌ ¸í¸í¹ýÀ» µû¸£Áö ¾Ê¾Æ¿ä.
  • [4] 4.2BSD ±â¹ÝÀÇ ¸î¸î UNIX¿¡¼­´Â 4¹ÙÀÌÆ® ¸ÅÁ÷³Ñ¹ö¸¦ ¾²±âµµ ÇÕ´Ï´Ù. #! /sh/bash ó·³ ! ´ÙÀ½¿¡ ºóÄ­À» ³Ö¾îÁÖ¾î¾ß ÇÏÁÒ.
  • [5] sh³ª bash¿Í °°Àº ¸í·É Çؼ®±â°¡ ½ºÅ©¸³Æ® óÀ½¿¡ µîÀåÇÏ´Â #!¶óÀο¡¼­ºÎÅÍ Çؼ®À» ½ÃÀÛÇÕ´Ï´Ù¸¸ ÀÌ ÁÙÀº #·Î ½ÃÀÛÇ߱⠶§¹®¿¡ ÁÖ¼®À¸·Î º¸°í ¹«½ÃÇÕ´Ï´Ù. ¹°·Ð #!¶óÀÎÀº ¸í·É Çؼ®±â È£ÃâÀ̶ó´Â º»·¡ÀÇ ¸ñÀûÀ» ´Þ¼ºÇÑ ÀÌÈÄÀ̱⠶§¹®¿¡ »ó°üÀº ¾ø´Â°ÅÁÒ. ¸¸¾à¿¡ ½ºÅ©¸³Æ® Áß°£¿¡ ¶Ç #!¶óÀÎÀÌ ³ªÅ¸³­´Ù°í Çصµ bash´Â À̸¦ ÁÖ¼®À¸·Î ó¸®ÇÕ´Ï´Ù.
  • [6] Portable Operating System Interface. UNIX-like OSµéÀ» Ç¥ÁØÈ­Çϱâ À§ÇÑ ½Ãµµ·Î, POSIX ½ºÆåÀº Open Group »çÀÌÆ®¿¡ Àß ³ª¿Í ÀÖ½À´Ï´Ù.
  • [7] ÁÖÀÇ: "sh scriptname"À¸·Î Bash ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇϸé Bash °íÀ¯ÀÇ ±â´ÉÀº ²¨Áý´Ï´Ù. µû¶ó¼­ ½ÇÇàÀÌ ¾ÈµÉ ¼öµµ ÀÖ¾î¿ä.
  • [8] ½©ÀÌ ½ºÅ©¸³Æ®¸¦ Àоî¾ß Çϱ⠶§¹®¿¡ Àб⠱ÇÇѵµ ÀÖ¾î¾ß ÇÕ´Ï´Ù.
  • [9] ±×³É scriptname¸¸ Ãļ­ ½ÇÇàÇÏÁö ¾Ê´Â ÀÌÀ¯°¡ ¹»±î¿ä? scriptnameÀÌ ($PWD)¿¡ Àִµ¥µµ ¾ÈµÇ´Â ÀÌÀ¯°¡ ¹»±î¿ä? ±×°ÍÀº º¸¾È»óÀÇ ÀÌÀ¯·Î $PATH¿¡ ÇöÀç µð·ºÅ丮¸¦ Æ÷ÇÔ½ÃÄÑ ³õÁö ¾Ê¾Ò±â ¶§¹®ÀÔ´Ï´Ù. ±×·¡¼­ ./scriptname °ú °°ÀÌ µð·ºÅ丮 ÁöÁ¤±îÁö ÇØÁÖ¾î¾ß ÇÏ´Â °ÅÁÒ.

ID
Password
Join
Nobody expects the Spanish Inquisition!


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-06-29 16:26:24
Processing time 0.0111 sec