Shell ÇÁ·Î±×·¡¹ÖÀÇ ±âº» Katja and Guido Socher
katja (at) linuxfocus.org
»ó¹è À±
yundream (at) coconut.co.kr
ÀÌ ¹®¼­´Â Linux focus ÀÇ 2001 ³â 9 ~ 10 ¿ù ±â»çÀÇ "point Shell Programming" À» ¹ø¿ªÇÑ°ÍÀÌ´Ù. ¿ÀŸ ¹× Å»ÀÚ ¿ë¾îÀÇ »ç¿ë¿¡ À־ ±×¸® ÁÖÀǸ¦ ±â¿ïÀÌÁö ¾ÊÀº °ü°è·Î ¹®¼­°¡ ¸Å²ô·´Áö ¾Ê°Ô ÁøÇàµÉ¼ö ÀÖÀ½À» ¹Ì¸® ¹àÈ÷¸ç, ÀÌ·¯ÇÑ ¹ö±×´Â Â÷ÈÄ ¾÷±×·¹À̵å? ¹öÁ¯¿¡¼­ ¼öÁ¤ÇÒ°ÍÀÓÀ» ¾à¼Ó? ÇÑ´Ù. ±×¸®°í ¿øº»¿¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Â ³»¿ëµéµµ »ó´ç¼ö µé¾î°¡ ÀÖ´Ù. ¸®´ª½º¸¦ À§ÇÑ ´Ù¾çÇÑ ±×·¡ÇÈÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÏ´Â ÇÁ·Î±×·¥µéÀÌ ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í ½©½ºÅ©¸³Æ®´Â ¿©ÀüÈ÷ ¸¹Àº »ç¶û?À» ¹ÞÀ¸¸ç ´Ù¾çÇÑ ºÎºÐ¿¡¼­ ÇʼöÀûÀÎ µµ±¸·Î »ç¿ëµÇ°í ÀÖ´Ù. ¾ð¶æ º¸±â¿¡ ±×·¡ÇÈÀÎÅÍÆäÀ̽ºÀÇ ´Ù¸¥ µµ±¸µé¿¡ ºñÇؼ­ »ç¿ëÇϱ⠾î·Á¿ö º¸ÀÌ°í ´ÙºÐÈ÷ ¿ø½ÃÀûÀ¸·Î º¸ÀÌÁö¸¸, ½© ÇÁ·Î±×·¡¹ÖÀ» ÅëÇÏ¿©, ¸¹Àº ³ëµ¿ÀÌ ÇÊ¿äÇÑ ÀÛ¾÷µéÀ» ´Ü¼øÈ­ ½Ãų¼ö ÀÖÀ¸¸ç, ÈǸ¢ÇÑ ½Ã½ºÅÛ °ü¸® µµ±¸·Î »ç¿ëÇÒ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¶ÇÇÑ ´ë±Ô¸ðÇÁ·ÎÁ§Æ®¸¦ ½ÃÀÛÇϱâ Àü¿¡ °£´ÜÇÑ ÇÁ·ÎÅäŸÀÔÀ» ¸¸µé¼ö ÀÖµµ·Ï ÇØÁÖ¸ç, ÀüüÀûÀ¸·Î ¾î¶² ÀÏÀ» ¼öÇàÇϴµ¥ À־ ½Ã°£°ú ³ë·ÂÀ» Àý¾àÇϵµ·Ï µµ¿ÍÁØ´Ù. ÀÌ·¸°Ô Àý¾àµÈ ½Ã°£À» Á»´õ »ý»êÀûÀÎÀÏ(µð¾Æºí·Î¸¦ Çϰųª, Ä¿ÇǸ¦ ¸¶½Ã´Â) ¿¡ÅõÀÚÇÒ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ÀÌ ¹®¼­¸¦ ÅëÇؼ­ ¿ì¸®´Â ÀÌ·¯ÇÑ ½© ½ºÅ©¸³Æ®ÀÇ »ç¿ë¹ý¿¡ ´ëÇؼ­ ¹è¿ì°Ô µÉ°ÍÀÌ´Ù. ¹®¼­ÀÇ ¼³¸íÀº ±ÛÀ»Àд ¿©·¯ºÐÀÌ ¾ÆÁÖ ±âº»ÀûÀÎ ÇÁ·Î±×·¡¹ÖÀ» Çغ»ÀûÀÌ ÀÖ°í Unix/Linux ȯ°æÀ» ÇѹøÀÌ¶óµµ Á¢ÇغÃÀ» °Å¶ó´Â °¡Á¤ÇÏ¿¡ ÀÌ·ç¾îÁú °ÍÀÌ´Ù. ÀÌ ¹®¼­´Â GNU Free Documentation License ¸¦ °¡Áý´Ï´Ù.
µé¾î°¡±âÀü¿¡
ÇÊ¿äÇÑ °Íµé ¸®´ª½º°¡ ±ò·ÁÀÖ´Â ÄÄÅÍ ÇѴ븸 ÀÖÀ¸¸é µÈ´Ù. ¶Ç´Â ¿ø°Ý ¸®´ª½º °èÁ¤À» °¡Áö°í ÀÖÀ¸¸é µÈ´Ù. bash ½©ÀÌ ÇÊ¿äÇÏ°ÚÁö¸¸, ´ëºÎºÐÀÇ ¸®´ª½º ¹Ú½º¿¡ °ÅÀÇ 100% ±ò·ÁÀÖ´Ù°í º¸¸é µÇ´Ï °ÆÁ¤ÇÒ ÇÊ¿ä ¾øÀ» °ÍÀÌ´Ù. ¸®´ª½º¹Ú½º¿¡ ·Î±×ÀÎ ÇÑ´ÙÀ½¿¡ "bash" ¶ó°í ¸í·ÉÀ» ³»·Áº¸ÀÚ, Á¦´ë·Î ½ÇÇàµÈ´Ù¸é bash ½©ÀÌ ±ò·Á ÀÖ´Â °ÍÀÌ´Ù. ÀÚ½ÅÀÇ ½Ã½ºÅÛÀÌ ¾Æ´Ò°æ¿ì ±âº»½©·Î bash ¿ÜÀÇ csh ³ª tcsh µîÀÇ ½©ÀÌ ±âº»½©·Î ÁöÁ¤µÇ¾î ÀÖÀ»¼öµµ ÀÖ´Ù. ÀÌ·²°æ¿ì °ü¸®ÀÚ¿¡°Ô ±âº»½©ÀÇ º¯°æÀ» ¿äûÇØ¾ß ÇÑ´Ù (¹°·Ð ·Î±×ÀδÙÀ½¿¡ ÇÁ·ÒÇÁÆ® »ó¿¡¼­ "/bin/bash" ¸í·ÉÀ» ½ÇÇàÇÔÀ¸·Î½á º£½¬ ½© ȯ°æÀ¸·Î µé¾î°¥¼öµµ ÀÖÁö¸¸) ÀÚ½ÅÀÇ ±âº» ½© ȯ°æÀ» ¾Ë¾Æº¸°í ½Í´Ù¸é "/etc/passwd" ÆÄÀÏÀ» º¸¸é µÈ´Ù. Âü°í·Î ÇÊÀÚÀÇ °æ¿ì "yundream:x:500:500::/home/yundream:/bin/bash" ·Î µÇ¾î ÀÖ´Ù.
½©À̶õ ¹«¾ùÀΰ¡ ½©Àº ´Ù¸¥¸»·Î ¸í·É¾î Çؼ®±â¶ó°í ºÒ¸®¿î´Ù. Àΰ£ÀÇ ¸í·É¾î¸¦ Çؼ®ÇÏ¿©(ÁÖ·Î ÀÚÆÇÀ» ÅëÇÏ¿© ¸í·ÉÇÔ), ½Ã½ºÅÛ(Ä¿³Î)¿¡ Àü´ÞÇÏ´Â ÀÏÀ» ÇÑ´Ù. ¸í·É¾î¸¦ Çؼ®ÇÏ´Â ¹æ¹ý¿¡ µû¶ó¼­ csh, tcsh, ksh, bash µîÀÇ ´Ù¾çÇÑ ½©ÀÌ Á¸ÀçÇÑ´Ù. À̸¦Å×¸é »ç¿ëÀÚ¿Í Ä¿³Î°£ÀÇ ¿øÇÒÇÑ Åë½ÅÀ» °¡´ÉÇϵµ·Ï µµ¿ÍÁÖ´Â Å뿪»ç Á¤µµ·Î »ý°¢ÇÏ¸é µÉ°ÍÀÌ´Ù. ¾î¶² À̸§ÀÇ ½©ÀÌ°Ç ±âº»ÀûÀ¸·Î ÇÏ´Â ÀÏÀº °°´Ù. ´Ù¸¸ º¯¼öÀÇ »ç¿ë¹æ¹ý, »ç¿ëµÇ¾îÁö´Â ¹®¹ý, ±×¹ÛÀÇ Ãß°¡ÀûÀÎ ±â´Éµé¿¡ À־ Â÷ÀÌ°¡ ÀÖÀ» »ÓÀÌ´Ù. ±×·¯ÇÑ ÀÌÀ¯·Î ÇϳªÀÇ ½©À» »ç¿ëÇÒ¼ö ÀÖ´Ù¸é, ´Ù¸¥ ½©µµ ±×¸® ¾î·ÆÁö ¾Ê°Ô »ç¿ë°¡´ÉÇÏ´Ù.
½ºÅ©¸³Æ®¸¦ ¸¸µéÀÚ ¸®´ª½º¿¡´Â ¸Å¿ì´Ù¾çÇÑ ¿©·¯ Á¾·ùÀÇ ½©ÀÌ Á¸ÀçÇϴµ¥, ÀÌ ¹®¼­¿¡¼­´Â bash(bourne again shell)À» »ç¿ëÇϵµ·Ï ÇÏ°Ú´Ù. ÀÌÀ¯´Â °¡Àå ³Î¸® »ç¿ëµÇ¸ç, ¹è¿ì±â ½±°í ¶ÇÇÑ ÇÊÀÚ°¡ »ç¿ëÇÏ´Â ½©À̱⠶§¹®ÀÌ´Ù. ¶§¹®¿¡ ÀÌ ¹®¼­¿¡ ÀÖ´Â ¸ðµç ½î¾²¿ª½Ã bash¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾î ÀÖ´Ù. ½© ÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§Çؼ­´Â nedit, kedit, emasc, vi µîÀÇ ¹®ÀÚ ÆíÁý±â°¡ ÇÊ¿äÇÏ´Ù. ¸¶À½¿¡ µå´Â ¾Æ¹« ÆíÁý±â³ª »ç¿ëÇϵµ·Ï ÇÏÀÚ. ½© ÇÁ·Î±×·¥ÀÇ Ã¹¹ø° ¶óÀÎÀº ¾Æ·¡¿Í °°Àº ¶óÀÎÀ» Æ÷ÇÔÇØ¾ß ÇÑ´Ù. #!/bin/sh #! Àº ½©¿¡°Ô ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇϱâ À§Çؼ­ #! ´ÙÀ½¿¡ ¿À´Â ¾Æ±Ô¸ÕÆ®¸¦ ½ÇÇàÇÁ·Î±×·¥À¸·Î »ç¿ëÇÑ´Ù´Â °ÍÀ» ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëµÈ´Ù. À§ÀÇ °æ¿ì¿¡´Â /bin/sh ¸¦ »ç¿ëÇ϶ó°í µÇ¾îÀÖ´Ù. ÀÏ´Ü À§ÀÇ Çü½ÄÀ¸·Î ÇÁ·Î±×·¥À» ¸¸µé°í À̸¦ ÀúÀåÇÏ¿´´Ù¸é, À̸¦ ½ÇÇà°¡´ÉÇÑ ÆÄÀÏ·Î ¸¸µé¾îÁà¾ß ÇÑ´Ù. ¸®´ª½º(Unix Æ÷ÇÔ) Àº À©µµ¿Í ´Þ¸® ÆÄÀÏÀÇ È®ÀåÀÚ¸í(.exe .com µî)À¸·Î ½ÇÇàÆÄÀÏ À¯¹«¸¦ °áÁ¤ÇÏÁö ¾ÊÀ¸¸ç, ÆÄÀϱÇÇÑ ¼³Á¤ÀÇ º¯°æÀ» ÅëÇÏ¿© ½ÇÇàÆÄÀÏ·Î °áÁ¤ÇÑ´Ù. ½ÇÇàÆÄÀÏ·Î ¸¸µé±â À§Çؼ­´Â ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÇ´Ù. chmod +x filename À§¿Í °°ÀÌ ÇÏ°í³ª¼­ ./filename ¸í·ÉÀ» ³»¸®¸é ÀÛ¼ºÇÑ ½© ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ´Ù.
ÁÖ¼® ÁÖ¼®Àº "#" À» ÀÌ¿ëÇϸç "#" ¿¡¼­ºÎÅÍ ¶óÀÎÀÇ ¸¶Áö¸· ±îÁö°¡ ÁÖ¼®À¸·Î 󸮵ȴÙ. ÁÖ¼®ºÎºÐÀº ½©ÀÌ ½ÇÇàµÉ¶§ ¹«½ÃµÈ´Ù. ÁÖ¼®Àº ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÀÌÇظ¦ ½±°Ô Çϱâ À§ÇÑ ¹æ¾ÈÀ¸·Î »ç¿ëµÈ´Ù. #!/bin/sh # ¸¸µçÀÌ : yundream # ÇÏ´ÂÀÏ : hello world ¸¦ Ãâ·ÂÇÑ´Ù. echo "hello world" # ¹®ÀÚ¿­À» Ãâ·ÂÇÑ´Ù.
º¯¼ö º¯¼ö´Â ¸ðµç ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ °¡Àå ±âº»ÀÌ µÇ´Â ¿ä¼ÒÀÌ´Ù. "º¯¼ö" ¶ó°íºÎ¸£°í´Â ÀÖÁö¸¸, ¾î¶² µ¥ÀÌŸ¸¦ ÀúÀåÇϱâ À§ÇÑ "Àӽðø°£" À̶ó°í ¸»ÇÏ´Â°Ô ´õ¿í Á¤È®ÇÑ Ç¥ÇöÀÏµí ½Í´Ù. Àΰ£ µÎ³ú·Î ÇÏÀÚ¸é, ´ë³úÇÇÁúÀÇ Çѱ¸¿ªÂë µÉ±î? ½©¿¡ÀÇ º¯¼öÀÇ µ¥ÀÌŸ ŸÀÔÀº string(¹®ÀÚ¿­) ¸¸À» °¡Áö¸ç, C ¾ð¾î¿Í °°Àº º¯¼ö ¼±¾ðÀ» ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â´Ù. ÀÌ´Â perl, python, php ¿ª½Ã ¸¶Âù°¡Áö ÀÌ´Ù. º¯¼ö¿¡ °ªÀ» ³Ö±â À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù. varname=value º¯¼öÀÇ »ç¿ëÀ» À§Çؼ­´Â º¯¼ö¸í ¾Õ¿¡ $ ¸¦ ºÙ¿©ÁÖ¸é µÈ´Ù. º¯¼ö¿¡ µ¥ÀÌŸ¸¦ ÀúÀåÇϱâ À§Çؼ­´Â ´ëÀÔ¿¬»êÀÚ"=" ¸¦ »ç¿ëÇÑ´Ù. ´ëÀÔ¿¬»êÀÚ¿Í, ÇÇ¿¬»êÀÚ/¿¬»êÀÚ »çÀÌ¿¡´Â °ø¹éÀÌ Á¸ÀçÇÏ¸é ¾ÈµÈ´Ù. #!/bin/sh # º¯¼ö¿¡ °ªÀ» ÇÒ´çÇÑ´Ù. a="hello world" # ÀÌÁ¦ a¶ó´Â º¯¼ö¿¡ µî·ÏµÈ °ªÀ» È­¸é¿¡ Ãâ·ÂÇÑ´Ù. echo "a is : $a" À§ÀÇ ³»¿ëÀ¸·Î ÆÄÀÏÀ» ¸¸µç´ÙÀ½ ÀúÀåÇÏ°í, ½ÇÇàÆÄÀÏ·Î ¸¸µé¾î¼­ ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú¹°ÀÌ È­¸é¿¡ Ãâ·ÂµÉ °ÍÀÌ´Ù. [yundream@localhost /home]# ./test.sh A is : hello world ¾Æ·¡¿Í °°ÀÌ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ num=2 echo "this is the $numnd" ¿ì¸®°¡ ¿øÇÏ´Â °ªÀº "this is the 2nd" ÀÌ´Ù. ±×·¯³ª ¿ì¸®°¡ ¿øÇÏ´Â °ª´ë½Å "this is the " ¶ó´Â ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÈ´Ù. ¿Ö³Ä¸é ½©Àº "numnd"¸¦ ÇϳªÀÇ º¯¼ö¸íÀ¸·Î »ý°¢ÇÏ°í Àֱ⠶§¹®ÀÌ´Ù. ÀÌ·Ä°æ¿ì¾Ö´Â ¾Æ·¡¿Í °°ÀÌ ÄÚµùÇÏ¸é µÈ´Ù. num=2 echo "this is the ${num}nd" À§ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°¸é ¿ì¸®°¡ ¿øÇÏ´Â °ªÀÎ "this is the 2nd" ¶ó´Â Ãâ·Â¹°À» ¾ò°Ô µÈ´Ù.
´ëÈ­¸ðµå ½©½ºÅ©¸³Æ®¸¦ Á¦ÀÛÇϴµ¥ À־ À§¿¡¼­¿Í °°ÀÌ ÆÄÀÏ·Î ÀúÀåÇÑ´ÙÀ½¿¡ À̸¦ ½ÇÇà±ÇÇÑÀ» Á־ ½ÇÇàÇÏ´Â ¹æ¹ýµµ ÀÖÁö¸¸, °£´ÜÇÏ°Ô ÀÛ¾÷À» ¼öÇàÇØ¾ß ÇÒ°æ¿ì ÆÄÀÏÀ» ¸¸µéÁö ¾Ê°í, ½©»ó¿¡¼­ Á÷Á¢ ½ÇÇà½ÃÅ°´Â ¹æ¹ýµµ ÀÖ´Ù. [root@localhost /root]# test="hello world" [root@localhost /root]# echo $test hello world ¾Æ·¡´Â Á»´õ º¹ÀâÇÑ ¿¹Á¦ÀÌ´Ù. [root@localhost /root]# if [ "$SHELL" = "/bin/bash" ] > then > echo "your login shell is the bash (bourne again shell)" > else > echo "your login shell is not bash but $SHELL" > fi your login shell is the bash (bourne again shell)
½©¸í·É°ú Á¦¾î±¸Á¶ À̹øÀå¿¡¼­´Â ½©½ºÅ©¸³Æ®¸¦ ´Ù·ç´Âµ¥ ÇÊ¿äÇÑ 3°¡Áö ºÎ¼öÀûÀÎ ÁÖÁ¦¸¦ ¼³¸íÇÏ°Ô µÉ°ÍÀÌ´Ù.
À¯´Ð½º ¸í·É¾îµé ½©½ºÅ©¸³Æ®´Â À¯´Ð½º ¸í·É¾îµéÀÇ ÁýÇÕÀ̹ǷÎ, À¯´Ð½º ¸í·É¾î¿¡ ´ëÇؼ­ ¾î´ÀÁ¤µµÀÇ ¼÷Áö°¡ ÇÊ¿äÇÏ´Ù. ÀÌ·¯ÇÑ ¸í·É¾îµéÀº ÁÖ·Î ÆÄÀÏ°ú ¹®ÀÚ¿­À» ÆíÁýÇϱâ À§Çؼ­ ¾²¿©Áø´Ù. ÀÌ·¯ÇÑ ¸í·É¾îµéÁß ÀÚÁÖ ¾²ÀÌ´Â ¸í·É¾îµéÀ» Á¤¸®Çß´Ù. ÀÚÁÖ »ç¿ëµÇ´Â À¯´Ð½º ¸í·É¾îµé echo "some text" some text ¸¦ È­¸é¿¡ Ãâ·ÂÇÑ´Ù wc -l file ÆÄÀÏÀÇ ¶óÀμö cp sourcefile destfile sourcefile À» destfile ·Î º¹»ç mv oldname newname ÆÄÀÏÀ̸§À» ¹Ù²Ù°Å³ª ÆÄÀÏÀÇ À̵¿ rm file ÆÄÀÏ Áö¿ì±â grep 'pattern' file ÆÄÀÏ¿¡¼­ patternÀÇ ¹®ÀÚ¿­À» ã±â cub -b colnum file ÆÄÀÏ¿¡¼­ ¹®ÀÚ¿­À» Ä÷³´ÜÀ§·Î Àß¶ó¼­ º¸¿©ÁÜ cat file.txt file.txt ¸¦ Ç¥ÁØÃâ·Â(stdout) ½ÃÅ´ file somefile somefile ÀÇ ÆÄÀÏŸÀÔ ¾Ë¾Æ³»±â read var ÀԷ°ªÀ» º¯¼ö¸ívar ¿¡ ´ëÀÔ sort file.txt file.txt ¸¦ ¶óÀδÜÀ§·Î Á¤·Ä uniq ÆÄÀÏ¿¡¼­ Áߺ¹µÇ´Â ¹®ÀÚ¿­À» Á¦°Å tee Ç¥ÁØÃâ·ÂµÇ´Â Á¤º¸¸¦ ÆÄÀÏ·Î ¾²±â basename file µð·ºÅ丮¸íÀ» Á¦¿ÜÇÑ ÆÄÀÏÀÇ ½ÇÁ¦À̸§À» µ¹·ÁÁÜ dirname file ÆÄÀÏÀ̸§À» Á¦¿ÜÇÑ µð·ºÅ丮ÀÇ À̸§À» µ¹·ÁÁÜ head file ÆÄÀÏÀÇ Ã³À½ ¸î¶óÀÎÀ» Ãâ·ÂÇÔ tail file ÆÄÀÏÀÇ ¸¶Áö¸· ¸î¶óÀÎÀ» Ãâ·ÂÇÔ sed Á¤±ÔÇ¥Çö¿¡ ÀÇÇÑ ¹®ÀÚ¿­ÀÇ °Ë»ö¹× ġȯ¿¡ »ç¿ëµÊ
pipes(ÆÄÀÌÇÁ), redirection(ÀçÁöÇâ) Pipes(|) ´Â ÇϳªÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѼ­ ¹ß»ýµÈ Ç¥ÁØÃâ·Â µ¥ÀÌŸ¸¦ ´Ù¸¥ ÇÁ·Î±×·¥¿¡ Ç¥ÁØÀÔ·Â ½ÃÅ°°íÀÚ ÇÒ¶§ »ç¿ëµÈ´Ù. Áï ÇÁ·Î¼¼½º°£ µ¥ÀÌŸ Åë½ÅÀ» À§ÇÑ ÇϳªÀÇ ¹æ¹ýÀ¸·Î »ç¿ëµÈ´Ù. grep "hello" file.txt | wc -l À§ÀÇ ½ºÅ©¸³Æ®´Â file.txt ¿¡¼­ hello¹®ÀÚ¿­À» Æ÷ÇÔÇÑ ¶óÀÎÀ» ã¾Æ¼­(grep), ¸î°³ÀÇ ¶óÀÎÀÌ hello ¸¦ Æ÷ÇÔÇÏ°í ÀÖ´ÂÁöÀÇ ¶óÀμö¸¦ µ¹·ÁÁØ´Ù. redirection Àº "ÀçÁöÇâ" À̶ó°í ºÒ¸®¿öÁø´Ù. ¿ì¸®³ª¶ó ¸»·Î Ç¥ÇöÇÏÀÚ¸é "´Ù½Ã ÇâÇÏ°Ô ÇÏ´Ù" À̸ç, ¾î¶² ÇÁ·Î±×·¥ÀÇ Ãâ·Â Á¤º¸¸¦ ´Ù¸¥°÷À¸·Î ´Ù½Ã ÇâÇÏ°Ô ÇÒ¶§ ¾²ÀδÙ. ¿©±â¿¡¼­ ´Ù¸¥°÷À̶õ ÁÖ·Î ÆÄÀÏÀ» ¶æÇÑ´Ù. ÀçÁöÇâÀ» À§Çؼ­´Â ">" °ú ">>" À» ¾´´Ù. ">"À» »ç¿ëÇÏ°Ô µÇ¸é »õ·Î¿î ÆÄÀÏÀ» ¸¸µé°Ô µÈ´Ù. ±âÁ¸¿¡ °°Àº À̸§ÀÇ ÆÄÀÏÀÌ ÀÖ¾ú´Ù¸é, ±× ÆÄÀÏÀº Áö¿öÁö°Ô µÈ´Ù. ">>" À» ¾²°Ô µÇ¸é ±âÁ¸¿¡ °°Àº À̸§ÀÇ ÆÄÀÏÀÌ ÀÖ´Ù¸é ±× ÆÄÀÏÀÇ ¸¶Áö¸·ºÎºÐ¿¡ µ¡ ºÙ¿©Áö°Ô µÈ´Ù. °°Àº À̸§ÀÇ ÆÄÀÏÀÌ ¾ø´Ù¸é ¹°·Ð »õ·Î¿î ÆÄÀÏÀ» ¸¸µé°Ô µÈ´Ù. [root@localhost /root]# cat address.txt | grep "seoul" > seoul_add.txt address.txt ¿¡´Â ÁÖ¼ÒÁ¤º¸°¡ ´ã°Ü ÀÖ´Ù. À§ÀÇ ½ºÅ©¸³Æ®´Â ÀÌÁß ÁÖ¼ÒÁö°¡ "seoul" ÀÎ Á¤º¸¸¸À» µû·Î »Ì¾Æ¼­ seoul_add.txt ¿¡ ÀúÀåÇÏ´Â ÀÏÀ» ¼öÇàÇÑ´Ù.
Á¦¾î±¸Á¶ "if"´Â ÂüÀÎÁö °ÅÁþÀÎÁö ÆÇ´ÜÇÒ¶§ »ç¿ëÇÑ´Ù. ÂüÀ̶ó¸é then ºÎºÐÀ» ½ÇÇàÇÏ°í ±×·¸Áö ¾Ê´Ù¸é else ºÎºÐÀ» ½ÇÇàÇÑ´Ù. if ..... then .... else .... fi if ÀÇ °¡Àå À¯¿ëÇÑ »ç¿ëó´Â "»óÅÂ" ¸¦ Å×½ºÆ®(test) Çϴµ¥ ÀÖ´Ù. Áï ¹®ÀÚºñ±³, ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö, ÆÄÀÏÀÌ ½ÇÇàÆÄÀÏÀÎÁö, µð·ºÅ丮ÀÎÁö, ÀÐÀ»¼ö ÀÖ´ÂÁö ... µî¿¡ À¯¿ëÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖÀ¸¸ç, ÀÌ·¯ÇÑ ÀÛ¾÷ÀÇ Á¦¾î¸¦ À§ÇÑ Æ¯¼öÇÑ ¸í·É¾î µéÀ» Á¦°øÇÑ´Ù. ÀÌ·¯ÇÑ "test" Á¶°ÇµéÀº "[ ]" »çÀÌ¿¡ ¾²¸éµÈ´Ù. "[" °ú "]" »çÀÌ¿¡´Â ¹Ýµå½Ã °ø¹é¹®ÀÚ°¡ µé¾î°¡¾ß µÈ´Ù´Â °ÍÀ» ÁÖÀÇÇÏÀÚ. [ -f "somefile" ] : somefile ÀÌ ÆÄÀÏÀÎÁö¸¦ Å×½ºÆ® ÇÑ´Ù. [ -x "/bin/ls" ] : /bin/ls °¡ ½ÇÇàÆÄÀÏÀÎÁö¸¦ °Ë»çÇÑ´Ù. [ -n "$var" ] : $var º¯¼ö¿¡ ¾î¶² °ªÀÌ ´ëÀԵǾî ÀÖ´ÂÁö¸¦ °Ë»çÇÑ´Ù. [ "$a" = "$b" ] : $a ¿Í $b °¡ °°ÀºÁö °Ë»çÇÑ´Ù. ["$a" = "$b"] : "[" °ú "]" »çÀÌ¿¡ °ø¹éÀÌ ¿ÀÁö ¾Ê¾ÒÀ½À¸·Î À߸øµÈ ¹®ÀåÀÌ´Ù. "man test" ¸¦ ÀÌ¿ëÇؼ­ ¾î¶°ÇÑ test operator ÀÌ ÀÖ´ÂÁö È®ÀÎ ÇÒ¼ö ÀÖ´Ù. #!/bin/sh if [ "$SHELL" = "/bin/bash" ] then echo "your login shell is the bash (bourne again shell)" else echo "your login shell is not bash but $SHELL" fi $SHELL Àº ȯ°æº¯¼ö·Î½á »ç¿ëÀÚÀÇ ·Î±×ÀÎ ½©ÀÇ À̸§À» °¡Áö°í ÀÖ´Ù. À§ÀÇ ½ºÅ©¸³Æ®´Â $SHELL ÀÇ °ªÀ» Å×½ºÆ® ÇÔÀ¸·Î½á »ç¿ëÀÚ°¡ ¾î¶² ½©À» »ç¿ëÇÏ´ÂÁö ¾Ë¾Æ³»´Â ÀÏÀ» ÇÑ´Ù.
°£´ÜÇÏ°Ô Ç¥ÇöÇϱâ C ¾ð¾î¸¦ ÀÚÁÖ »ç¿ëÇØ º»»ç¶÷Àº ¾Æ·¡¿Í °°Àº ¹®Àå¿¡ Àͼ÷ÇÒ °ÍÀÌ´Ù. [ -f "/etc/shadow" ] && echo "This computer uses shadow passwords" À§ÀÇ ¹®Àå¿¡¼­´Â && À» »ç¿ëÇؼ­ if ¹®À» °£´ÜÇÏ°Ô Ç¥ÇöÇÏ°í ÀÖ´Ù. ¿ÞÂÊ ¹®ÀåÀÌ ÂüÀÌ¸é ¿À¸¥ÂÊÀ» ½ÇÇàÇ϶ó´Â °ÍÀ¸·Î, /etc/shadow ¶ó´Â ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù¸é ½¦µµ¿ì Æнº¿öµå¸¦ »ç¿ëÇÑ´Ù°í À¯Àú¿¡°Ô ¾Ë·ÁÁÖ´Â ÀÏÀ»ÇÑ´Ù. || ¸¦ »ç¿ëÇÏ¸é ±×¹Ý´ëÀÇ °æ¿ìÀÌ´Ù. °£´ÜÇÑ »ç¿ë¿¹¸¦ µé¾î º¸°Ú´Ù. #!/bin/sh mailfolder=/var/spool/mail/james [ -r "$mailfolder" ] || { echo "Can not read $mailfolder; exit 1;} echo "$mailfolder has mail from : " grep "^From " $mailfolder À§ÀÇ ÇÁ·Î±×·¥Àº james °èÁ¤»ç¿ëÀÚÀÇ ¸ÞÀÏÆÄÀÏÀ» °Ë»çÇؼ­ ¸ÞÀÏ ÆÄÀÏÀ» ÀÐÀ»¼ö ¾øÀ¸¸é ¿¡·¯¸Þ½ÃÁö¿Í ÇÔ²² Á¾·á ÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é grep À» ½á¼­ ´©±¸¿¡°Ô·Î ºÎÅÍ ¸ÞÀÏÀÌ ¿Ô´ÂÁö¸¦ °èÁ¤ »ç¿ëÀÚ¿¡°Ô ¾Ë·ÁÁÖ´Â ÀÏÀ»ÇÑ´Ù. case ´Â if elif else ¸¦ Á»´õ ÀϹÝÈ­ ½ÃŲ Á¦¾î±¸Á¶ÀÌ´Ù. if ¹®À» ¾²´õ¶óµµ ¿©·¯¹øÀÇ Á¶°Ç¿¡ ´ëÇؼ­ °Ë»çÇÒ¼öÀÖÁö¸¸ ±×·²°æ¿ì if elif °¡ ¾îÁö·´°Ô Áßø µÇ´Â °á°ú¸¦ º¸¿©ÁÙ°ÍÀÌ´Ù. ÀÌ·²¶§ case ¸¦ »ç¿ëÇϸé Á»´õ °¡µ¶¼º°ú À¯Áö°¡ ¿ëÀÌÇÑ Äڵ带 ¸¸µé¾î ³¾¼ö ÀÖ´Ù. Áï if elsif ¸¦ °£´ÜÇÏ°Ô Ç¥ÇöÇÒ¼ö ÀÖ´Ù. ÀÌÇظ¦ ½±°Ô Çϱâ À§Çؼ­ ƯÁ¤ÆÄÀÏÀÌ ¾î¶°ÇÑ Æ÷¸äÀÇ ¾ÐÃàÆÄÀÏÀÎÁö¸¦ ¾Ë¾Æ³»´Â ½ºÅ©¸³Æ®¸¦ ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ÆÄÀÏÀÇ Á¾·ù¸¦ ¾Ë±â À§Çؼ­´Â file À̶õ ¸í·ÉÀ» ¾²¸é µÈ´Ù. ¾Æ·¡ÀÇ ¿¹Á¦¸¦ smartzip À̶õ ÆÄÀÏ·Î ÀúÀåÇϵµ·Ï ÇÏÀÚ. #!/bin/sh ftype=`file "$1"` case "$ftype" in "$1: gzip compressed"*) echo "gzip ¾ÐÃà";; "$1: Zip archive"*) echo "Zip ¾ÐÃà";; *) echo "FLE $1 can not be uncompressed with smartzip";; esac $1 º¯¼ö´Â ÇÁ·Î±×·¥ÀÇ Ã¹¹ø° ¾Æ±Ô¸ÕÆ®¸¦ ÀúÀåÇÏ°í ÀÖ´Â º¯¼ö´Ù. ivmdemo.tar.gz ÀÇ ¾ÐÃàÆ÷¸ËÀ» ¾Ë°í ½Í´Ù¸é, smartzip ivmdemo.tar.gz À̶ó°í ¸í·ÉÀ» ³»¸®¸é µÈ´Ù. Àú À­Àå¿¡¼­ ´Ù·éÀûÀÌ ÀÖ´Â µ¡¼À ½ºÅ©¸³Æ®¸¦ case ¸¦ ÀÌ¿ëÇÏ¿© »çÄ¢¿¬»êÀ» ¼öÇàÇϵµ·Ï È®Àå½ÃÄѺ¸ÀÚ. ¹°·Ð ¾Æ·¡ÀÇ°æ¿ì ±»ÀÌ ½ºÅ©¸³Æ®¸¦ ¸¸µéÇÊ¿ä ¾øÀÌ expr ¸¸À» »ç¿ëÇصµ µ¿ÀÏÇÑ ÀÛ¾÷ÀÌ °¡´ÉÇÏÁö¸¸, ¾îµð±îÁö³ª case ÀÇ È°¿ë¹ý ¿¡ ´ëÇÑ ÀÌÇظ¦ À§ÁÖ·ÎÇÔÀÌ´Ï È¿À²¼º, °¡¿ë¼º ±âŸµîµîÀº ¹«½ÃÇÏ°í ³Ñ¾î°¡±â·Î ÇÏÀÚ. #!/bin/sh add() { result=`expr $1 + $2` echo "$1 + $2 = $result" } min() { result=`expr $1 - $2` echo "$1 - $2 = $result" } div() { result=`expr $1 / $2` echo "$1 / $2 = $result" } mul() { result=`expr $1 \* $2` echo "$1 * $2 = $result" } #echo "$1, $2" case $1 in "-") min $2 $3 ;; "+") add $2 $3 ;; "/") div $2 $3 ;; "*") mul $2 $3 ;; esac À§ÀÇ ½ºÅ©¸³Æ®´Â ù¹ø° ¾Æ±Ô¸ÕÆ®·Î ¿¬»êÀÚ¸¦ ¹Þ¾ÆµéÀÌ°í µÎ¹ø° ¼¼¹ø° ¾Æ±Ô ¸ÕÆ®·Î °è»êÇÏ°íÀÚ ÇÏ´Â ¼ýÀÚ¸¦ ÀÔ·ÂÇÑ´Ù. "add - 1 3" ÀÌ·±½ÄÀ¸·Î »ç¿ëÇÏ¸é µÈ´Ù. ÁÖÀÇÇÒ Á¡Àº °ö¼À(*) ¿¬»êÀ» »ç¿ëÇÒ °æ¿ì "\" µîÀ» »ç¿ëÇؼ­ "add \* 1 3" Çü½ÄÀ¸·Î ½á¾ßÇÑ´Ù´Â Á¡ÀÌ´Ù. ½©»ó¿¡¼­ * ´Â ¿ÍÀϵåÄ«µå È®ÀåÀ» ½ÇÇàÇϱ⠶§¹®ÀÌ´Ù. À̹ø¿¡´Â select Á¦¾î¹®¿¡ ´ëÇؼ­ ¾Ë¾Æº¸ÀÚ select ´Â interactive(´ëÈ­Çü) ¸Þ´º ÇÁ·Î±×·¥À» Â¥´Âµ¥ ¸Å¿ì °£´ÜÇÑ ¹æ¹ýÀ» Á¦°øÇØÁØ´Ù. »ç¿ëÀÚ°¡ ¾î¶² OS¸¦ °¡Àå ¼±È£ÇÏ´ÂÁö ¸Þ´º¸¦ º¸°í ±×Áß Çϳª¸¦ ¼±ÅÃÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. #!/bin/sh echo "What is your favourite OS ?" select var in "Linux" "Free BSD" "Windows" "Solaris" "Other" do break done echo "You have selected $var" À§ÀÇ ½ºÅ©¸³Æ®¸¦ ½ÇÇà½ÃÅ°¸é ¾Æ·¡¿Í °°Àº ¸Þ´º°¡ ¶ß°í »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¿ä±¸ÇÏ´Â ÇÁ·ÒÇÁÆ®°¡ ´ë±â ÇÏ°Ô µÉ°ÍÀÌ´Ù. What is your favourite OS ? 1) Linux 2) Free BSD 3) Windows 4) Solaris ¿øÇÏ´Â ¿î¿µÃ¼Á¦ÀÇ ¹øÈ£(1 - 4) ¸¦ ¼±ÅÃÇÏ¸é ¼±ÅÃµÈ ¹øÈ£ÀÇ ¹®ÀÚ¿­ÀÌ var º¯¼ö¿¡ ÀúÀåµÈ´Ù. 1 À» ÀÔ·ÂÇÏ¿´´Ù¸é var º¯¼ö¿£ Linux °¡ ÀúÀå µÈ´Ù. while Àº Á¶°ÇÀÌ ¸¸Á·ÇÏ´Â µ¿¾È ·çÇÁ¸¦ ¹Ýº¹ÇÑ´Ù. while ... do ... done ´ÙÀ½Àº while ¸¦ »ç¿ëÇؼ­ 1ºÎÅÍ 10±îÁö Ãâ·ÂÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. #!/bin/sh a=0 while [ $a -lt 10 ] do a=`expr $a + 1` echo $a done bashsehll ¿¡¼­ÀÇ for ¹®Àº CÀÇ for ¹®°ú´Â »ç¿ë¿¡ À־ Â÷ÀÌ°¡ ³­´Ù. sehll ¿¡À־´Â in ´ÙÀ½ÀÇ °ªµéÀ» Â÷·Ê´ë·Î º¯¼ö¿¡ ÀÔ·ÂÇÏ´Â ÀÏÀ» ÇÑ´Ù. #!/bin/sh for var in A B C do echo "var is $var" done for ¹®À» ÀÌ¿ëÇÑ Á»´õ À¯¿ëÇÑ ½ºÅ©¸³Æ®¸¦ ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ¾Æ·¡ÀÇ ½ºÅ©¸³Æ®´Â ¹èÆ÷ÆÇ CD¿¡ ÇØ´ç rpmÀÌ ÀÖ´ÂÁö¸¦ È®ÀÎÇÏ°í, ÀÖ´Ù¸é rpm ÆÐÅ°ÁöÀÇ Á¤º¸¸¦ º¸¿©ÁÖ´Â ÀÏÀ» ÇÑ´Ù. ¾Æ·¡ÀÇ ³»¿ëÀ» showrpm À¸·Î ÀúÀåÇϵµ·Ï ÇÏÀÚ. #!/bin/sh for rpmpackage in $* do if [ -r "$rpmpackage" ] then echo "================ $rpmpackage =============" rpm -qi -p $rpmpackage else echo "ERROR: cannot read file $rpmpackage" fi done À§ÀÇ ½ºÅ©¸³Æ®¸¦ º¸¸é $* À̶ó´Â º¯¼ö°¡ º¸ÀÏ°ÍÀÌ´Ù. $*´Â ¸ðµç ¾Æ±Ô¸ÕÆ®¸¦ ÀúÀåÇÏ´Â º¯¼öÀÌ´Ù.
Quoting #!/bin/sh echo $SHELL echo "$SHELL" echo '$SHELL' À§ÀÇ ½ºÅ©¸³Æ®¿¡¼­ 1¹ø°¿Í 2¹ø°ÀÇ °æ¿ì ÀÚ½ÅÀÌ »ç¿ëÇÏ´Â ½©À» Ãâ·ÂÇÏÁö¸¸ (¾Æ¸¶µµ /bin/bash) 3¹ø°ÀÇ °æ¿ì $SHELL ÀÚü¸¦ Ãâ·ÂÇÏ´Â°É º¼¼ö ÀÖÀ»°ÍÀÌ´Ù. ' ¸¦ »ç¿ëÇÏ¸é ½©ÀÌ »ç¿ëÇϴ Ư¼ö¹®ÀÚ(keyword)¸¦ ÀϹÝÈ­ ½ÃÄѼ­ »ç¿ëÇÒ¼ö ÀÖ´Ù. ¶ÇÇÑ ¹é½½·¯½¬¸¦ »ç¿ëÇؼ­ ¿ÍÀϵåÄ«µå³ª º¯¼ö±âÈ£¿Í °°Àº Ư¼öÇÑ ¹®ÀÚ¸¦ ÀϹÝÈ­ ½Ãų¼öµµ ÀÖ´Ù. echo \$SHELL À§¿¡¼­ ¹é½½·¯½¬¸¦ »ç¿ëÇÔÀ¸·Î½á $ ÀÇ Æ¯º°ÇÑ Àǹ̸¦ Á¦°Å½ÃÄÑ ¹ö¸²À¸·Î½á $SHELL À̶õ ¹®ÀÚ¿­À» Ãâ·ÂÇϵµ·Ï ¸¸µç´Ù. ¿¹¸¦ µé¾î¼­ $1,000 ¸¦ È­¸é¿¡ Ãâ·Â ½ÃÅ°·Á°í ÇÑ´Ù°í °¡Á¤ÇÏÀÚ ÀÌ·²¶§ ¾Æ·¡¿Í °°ÀÌ ½á¹ö¸®¸é echo $1000 ¾Æ¹«·± °ªµµ Ãâ·ÂµÇÁö ¾ÊÀ½À» ¾Ë¼ö ÀÖ´Ù. ¿Ö³Ä¸é ½©Àº 1000 ¾Õ¿¡ $ °¡ ÀÖÀ½À¸·Î À̸¦ º¯¼ö¸íÀ¸·Î »ý°¢ÇÏ°í ÀÌ º¯¼ö¸í¿¡ ÀúÀåµÈ °ªÀ» echo ÇÏ·Á°í ÇÒ°ÍÀ̱⠶§¹®ÀÌ´Ù. ¿ì¸®°¡ ¿øÇÏ´Â °ªÀ» ¾òÀ»·Á¸é ¾Æ·¡¿Í °°ÀÌ Äڵ带 ¼öÁ¤ÇØ¾ß ÇÑ´Ù. echo \$1000
ÇÔ¼ö ¿©·¯ºÐÀÌ Á»´õ º¹ÀâÇÑ ÇÁ·Î±×·¥À» ¸¸µé´Ùº¸¸é ÇÔ¼öÀÇ Çʿ伺À» ´À³¢°Ô µÉ°ÍÀÌ´Ù. ÇÔ¼ö¸¦ »ç¿ëÇÔÀ¸·Î½á, Á»´õ ÀÌÇØÇϱ⠽±°í ´Ü¼øÇÑ ÇÁ·Î±×·¥À» ¸¸µé¼ö ÀÖÀ¸¸ç, Àç»ç¿ëÀ» ¿ëÀÌÇϵµ·Ï ¸¸µé¼ö ÀÕ´Ù. ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù. functionname() { body } sehll Àº ½ºÅ©¸³Æ® ¾ð¾îÀÌ°í ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÀÌ µÇ¹Ç·Î ÇÔ¼ö¸¦ »ç¿ëÇϱâ Àü¿¡ ¸ÕÀú ¼±¾ðÀ» ÇØÁÖ¾î¾ß¸¸ ÇÑ´Ù. #!/bin/sh help() { cat << HELP xtitle bar -- change the name of an xterm, gnome-teminal or kde konsole Usage: xtitlebar [-h] "string_for_titlebar" OPTIONS: -h help text EXAMPLE: xtitlebar "cvs" HELP exit 0 } [ -z "$1" ] && help [ "$1" = "-h" ] && help ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ °£´ÜÇÑ µ¡¼À ½ºÅ©¸³Æ®¸¦ ¸¸µé¾î º¸ÀÚ. 2°³ÀÇ ÀÎÀÚ¸¦ ¹Þ¾ÆµéÀÌ°í À̸¦ ´õÇÑÈÄ Ãâ·ÂÇÏ´Â ÀÏÀ» ÇÑ´Ù. #!/bin/sh add() { result=`expr $1 + $2` echo "$1 + $2 = $result" } add $1 $2
¸í·ÉÇà ÀÎÀÚ(argument) °¢ ¸í·ÉÇà ÀÎÀÚ´Â $* °ú $1, $2, $3, ... µîÀÇ º¯¼ö¸¦ ÅëÇؼ­ °¡Á®¿Ã¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ¸í·ÉÇà ÀÎÀÚµéÀ» ´Ü¼øÈ÷ ÀоîµéÀÌ´Â °Í¸¸À¸·Î´Â -h ¿Í °°Àº ¸í·ÉÇà ¿É¼Ç¿¡ ´ëÇÑ ³»¿ëÀº ´Ù·ê¼ö ¾ø´Ù. ¿Ö³Ä¸é shell ¿¡¼­´Â -h ¸¦ ¿É¼ÇÀÌ ¾Æ´Ñ ÀÎÀÚ·Î Ãë±ÞÇϱ⠶§¹®ÀÌ´Ù. À̸¦ ó¸®Çϱâ À§Çؼ­´Â ¾à°°ÀÇ ±â¼úÀÌ ÇÊ¿äÇÏ´Ù. º¸Åë C¿¡¼­´Â getopt()¿Í °°Àº ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ¿É¼ÇÀ» ó¸®ÇÑ´Ù. ¾Æ·¡´Â ¸í·ÉÇà ÀÎÀÚ¸¦ ºÐ¼®ÇÏ´Â ½©ÇÁ·Î±×·¥ÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº cmdparser ·Î ÇÏÀÚ #!/bin/sh help() { cat << HELP This is a generic command line parser demo. Usage Example : cmdparser -l hello -f somefile1 somefile2 HELP exit 0 } while [ -n "$1" ] do case $1 in -h) help; shift1;; -f) opt_f=1;shift 1;; -l) opt_l=$2;shift 2;; --) shift;break;; -*) echo "error : no such option $1. -h for help"; exit 1;; *) break; esac done echo "opt_f is $opt_f" echo "opt_l is $opt_1" echo "first arg is $1" echo "2nd arg is $2" shift ¶õ »õ·Î¿î ½©¸í·ÉÀÌ ³ª¿Ô´Âµ¥, ¾Æ±Ô¸ÕÆ®¸¦ Çϳª¾¿ À̵¿½ÃÅ°´Â ÀÏÀ»ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº man bash ¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. À§ÀÇ ½ºÅ©¸³Æ®¸¦ cmdparser -l hello -f -- -somefile1 somefiel2 ·Î ½ÇÇà½ÃÄѺ¸¸é ¾Æ·¡¿Í °°Àº °á°ú°¡ ³ª¿Ã°ÍÀÌ´Ù. opt_f is 1 opt_l is hello first arg is -somefile1 2nd arg is somefile2 À§ÀÇ ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö ¾Ë¾Æº¸ÀÚ, À§ÀÇ ·çÇÁ´Â ¾Æ±Ô¸ÕÆ®°¡ °Ë»öµÉ¶§±îÁö °è¼ÓÇؼ­ ¼øȯÇϵµ·Ï µÇ¾î ÀÖÀ¸¸ç case ¸¦ ÀÌ¿ëÇؼ­ ¾Æ±Ô¸ÕÆ®¿Í ´ëÀÀµÇ´Â °ªÀ» ¸ÅĪ½ÃŲ´Ù. ¸¸¾à¿¡ ¸ÅĪµÈ °ªÀ» ã¾Ò´Ù¸é, ÇØ´ç ¸í·É¾î³ª ÇÔ¼ö¸¦ ½ÇÇàÇÏ°í shift ¸¦ ÀÌ¿ëÇؼ­ ÇÊ¿äÇÑ ¸¸Å­ ¾Æ±Ô¸ÕÆ®¸¦ À̵¿½ÃŲ´Ù.
¿¹Á¦
ÀϹÝÀûÀÎ ½©ÇÁ·Î±×·¥ÀÇ ±¸Á¶ À̹øÀå¿¡¼­´Â ±×µ¿¾È ¹è¿ü´ø ±âº»ÀûÀÎ ³»¿ëµéÀ» Åä´ë·Î, ½ÇÁúÀûÀÎ ½©ÇÁ·Î±×·¥À» ¸¸µéµµ·Ï Çغ¸ÀÚ. ¸ðµç Á¾·ùÀÇ ÈǸ¢ÇÑ ½©½ºÅ©¸³Æ®´Â µµ¿ò¸»À» °¡Áö°í ÀÖÀ¸¸ç, ¾Æ±Ô¸ÕÆ®¿É¼ÇÀ» ÆĽÌÇÏ´Â ÀϹÝÀûÀÎ ·çƾÀ» °¡Áö°í ÀÖ´Ù. À̹ø¿¡ »õ·Î¸¸µé ½ºÅ©¸³Æ®´Â ÀÌ·¯ÇÑ ÁÁÀº ½ºÅ©¸³ Æ®°¡ °¡Áö´Â ·çƾµéÀ» Æ÷ÇÔÇÏ°Ô µÉ°ÍÀÌ´Ù.
¹ÙÀ̳ʸ®¸¦ 10Áø¼ö·Î ¹Ù²ãÁÖ´Â ÀÌ ½ºÅ©¸³Æ®´Â ¹ÙÀ̳ʸ®¸¦ ¼ýÀÚ·Î ¹Ù²ãÁÖ´Â ÀÏÀ»ÇÑ´Ù. °£´ÜÇÑ »ê¼ö °Ô»êÀ» À§Çؼ­ expr À» »ç¿ëÇϵµ·Ï ÇÑ´Ù. #!/bin/sh help() { cat << HELP b2h -- convert binary to decimal USAGE: b2h [-h] binarynum OPTIONS: -h help text EXAMPLE: b2h 111010 whill return 58 HELP exit 0 } error() { # print an error and exit echo "$1" exit 1 } lastchar() { #return the last character of a string in $rval if [ -z "$1" ] then rval="" return fi numofchar=`echo -n "$1" | wc -c | sed 's/ //g'` rval=`echo -n "$1" | cut -b $numofchar` } chop() { # remove the last character in string and return it in $rval if [ -z "$1" ] then # empty string rval="" return fi # wc puts some space behind the output this is why we need sed: numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` if [ "$numofchar" = "1" ] then # only one char in string rval="" return fi numofcharminus1=`expr $numofchar "-" 1` # now cut all but the last char: rval=`echo -n "$1" | cut -b 0-${numofcharminus1}` } while [ -n "$1" ] do case $1 in -h) help;shift 1;; # function help is called --) shift;break;; # end of options -*) error "error: no such option $1. -h for help";; *) break;; esac done # The main program sum=0 weight=1 # one arg must be given: [ -z "$1" ] && help binnum="$1" binnumorig="$1" while [ -n "$binnum" ]; do lastchar "$binnum" if [ "$rval" = "1" ] then sum=`expr "$weight" "+" "$sum"` fi # remove the last position in $binnum chop "$binnum" binnum="$rval" weight=`expr "$weight" "*" 2` done echo "binary $binnumorig is decimal $sum" À§ÀÇ ÇÁ·Î±×·¥Àº À̸¥¹Ù 2Áø¼ö¸¦ 10Áø¼ö·Î ¹Ù²Ù¾îÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¸¸¾à¿¡ À§ÀÇ ½ºÅ©¸³Æ®·Î ÁÖ¾îÁø ¾Æ±Ô¸ÕÆ®°¡ 1101 À̶ó¸é, 2Áø¼ö¸¦ 10Áø¼ö·Î ¹Ù²Ù´Â °è»ê¹ý¿¡ ÀÇÇؼ­ ¾Æ·¡¿Í °°Àº °á°ú°¡ ³ª¿À°Ô µÉ°ÍÀÌ´Ù. 1*2^3 + 1*2^2 + 0*2 + 1 = 6 À§ ÇÁ·Î±×·¥ÀÇ ºÐ¼®Àº ¿©·¯ºÐ °¢ÀÚ¿¡°Ô ¸Ã±â°Ú´Ù.
µð¹ö±ë µð¹ö±ëÀ» À§ÇÑ °¡Àå°£´ÜÇÑ ¹æ¹ýÀº echo ¸í·ÉÀ» ÀÌ¿ëÇؼ­ °á°ú°ªÀ» Ãâ·ÂÇغ¸´Â ¹æ¹ýÀÌ´Ù. - À̹æ¹ýÀº ´Ù¸¥ ¸ðµç ¾ð¾î¿¡µµ °øÅëÀûÀ¸·Î Àû¿ëµÈ´Ù. C´Â printf, PerlÀº print µîÀÌ µÉ°ÍÀÌ´Ù - ´ç½ÅÀº echo ¸¦ ÀÌ¿ëÇؼ­ º¯¼ö°ªÀ» ¾Ë¾Æº½À¸·Î½á, ¾î´ÀºÎºÐ¿¡¼­ ½Ç¼ö¸¦ Çß´ÂÁö¸¦ ¾Ë¼ö ÀÖ´Ù. ¾Æ¸¶µµ ´ëºÎºÐÀÇ ½© ÇÁ·Î±×·¡¸Ó´Â ÀÌ·¯ÇÑ ½Ç¼ö¸¦ ã´Âµ¥ Àüü ÇÁ·Î±×·¥À» Â¥´Â ½Ã°£ÀÇ 80% Á¤µµ¸¦ º¸³¾°ÍÀÌ´Ù. ½©½ºÅ©¸³Æ®ÀÇ ÀÕÁ¡Àº ÀÌ·¯ÇÑ Å×½ºÆ®¸¦ À§Çؼ­ echo ¹®À» »ç¿ëÇϴµ¥, ´Ù½Ã ÄÄÆÄÀÏÇÒ ÇÊ¿ä°¡ ¾ø¾î¼­, ½Ã°£À» Àý¾àÇÒ¼ö ÀÖ´Ù¶ó´Â °ÍÀÌ´Ù. ½©½ºÅ©¸³Æ®¸¦ µð¹ö±ë ¸ðµå·Î µ¹¸®°í ½Í´Ù¸é ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù. µð¹ö±ë ÇÏ°íÀÚ ÇÏ´Â ½©½ºÅ©¸³Æ®ÀÇ À̸§Àº strangescript ¶ó°í ÇÏÀÚ. sh -x strangescript À§¿Í °°ÀÌ ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇϸé, ½©ÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ »ç¿ëµÈ º¯¼öÀÇ ¸ðµç °ªÀ» È­¸é»ó¿¡ Ãâ·Â½ÃÄÑÁØ´Ù. ±×·³À¸·Î ¾î´À °÷¿¡¼­ ½Ç¼ö¸¦ Çß´ÂÁö ½±°Ô ãÀ»¼ö ÀÖ´Ù. sh -n strangescript À§¿Í °°ÀÌ "-n" ¿É¼ÇÀ» ÀÌ¿ëÇϸé syntax ¿À·ù¸¦ ã¾Æ³¾¼ö ÀÖ´Ù. À§ÀÇ ¿É¼Ç¿¡¼­´Â syntax ¿À·ù ¿ÜÀÇ ´Ù¸¥ °ªµéÀº º¸¿©ÁÖÁö ¾Ê´Â´Ù.
È¿À²ÀûÀÎ ÀÛ¾÷À» À§Çؼ­ ´Ù¸¥ ¿©·¯°¡Áö ÈǸ¢ÇÑ ¾ð¾î(C, Perl, Python)°¡ ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í ¿©ÀüÈ÷ ½©À» »ç¿ëÇÏ´Â ÀÌÀ¯´Â È¿À²ÀûÀÎ ÀÛ¾÷À» À§Çؼ­ ÀÏ°ÍÀÌ´Ù. bash ´Â »ç¿ëÀÚ°¡ Áߺ¹½Ã°£À» ÁÙÀÌ°í, ÀÛ¾÷À» ºü¸£°í È¿À²ÀûÀ¸·Î ÇÒ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­ history, ¸í·É¾îġȯ °ú °°Àº ¿©·¯°¡Áö ±â´ÉµéÀ» Á¦°øÇÑ´Ù.
ȯ°æº¯¼ö bash(´Ù¸¥ ½©µµ ¸¶Âù°¡Áö)Àº ȯ°æº¯¼ö¶ó´Â°É »ç¿ëÇÑ´Ù. ȯ°æº¯¼ö´Â ½©ÀÌ ¿î¿ëµÇ´Âµ¥ ÇÊ¿äÇÑ ¿©·¯°¡Áö °ªµéÀ» °¡Áö°í ÀÖ´Ù. ´ëÇ¥ÀûÀÎ ¿¹·Î SHELL º¯¼ö°¡ ÀÖ´Ù. À̺¯¼ö¿¡´Â ÇöÀç ·Î±×ÀÎ À¯Àú°¡ »ç¿ëÇÏ°í ÀÖ´Â ½©ÀÌ ¾î¶²°ÇÁö¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. ¿©·¯ºÐÀÌ ÇöÀç »ç¿ëÇÏ´Â ½©ÀÌ ¾î¶²°ÇÁö ¾Ë°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇϸéµÈ´Ù. [yundream@localhost yundream]$ echo $SHELL /bin/bash À̹ۿ¡µµ PATH, USER, TERM, PWD µî°ú °°Àº ¸¹Àº ȯ°æº¯¼ö¸¦ °¡Áö°í ÀÖ´Ù. ȯ°æº¯¼ö¸¦ ¼¼ÆÃÇϱâ À§Çؼ­´Â export ¶ó´Â ½© ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù. [yundream@localhost yundream]$ export MY_NAME="yundream" [yundream@localhost yundream]$ echo $MY_NAME yundream ÇöÀç ¼³Á¤µÇ¾î ÀÖ´Â ¸ðµç ȯ°æº¯¼ö¸¦ º¸±â À§Çؼ­´Â set ¸í·ÉÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù. ÀÌ·¸°Ô Çؼ­ ¼³Á¤µÈ ȯ°æº¯¼ö´Â ÇöÀç ½©¿¡¼­ ½ÇÇàµÇ´Â ¸ðµç ÀÚ½Ä ÇÁ·Î¼¼½º¿¡ »ó¼Ó µÇ°Ô µÈ´Ù.
history history ´Â ÀÌÀü¿¡ ³»·È´ø ¸í·ÉÀ» ±â¾ïÇؼ­ ´Ù½Ã ½á¸ÔÀ¸·Á°í ÇÒ¶§ À¯¿ëÇÏ´Ù. Å͹̳ο¡¼­ history ¸í·ÉÀ» ³»¸²À¸·Î½á ÀÌÀü¿¡ ½ÇÇàÇß´ø ¸í·É¾îÀÇ ¸ñ·ÏÀ» È®ÀÎÇÒ¼ö ÀÖ´Ù. [yundream@localhost yundream]$ history 1 micq 2 exit 3 make clean ... 454 vi /home/httpd/cont/httpd.conf 455 history È÷½ºÅ丮°¡ ÀúÀåµÇ´Â Å©±â´Â ȯ°æº¯¼öÀÎ HISTSIZE ¿¡ ÀúÀåµÈ´Ù. º¸ÅëÀº 1000 ¶óÀÎÁ¤µµ·Î ¼¼ÆõǾî ÀÖ´Ù. È÷½ºÅ丮¿¡¼­ ¿øÇÏ´Â ¸í·ÉÀ» »ç¿ëÇÏ°í ½ÍÀ»¶§´Â "!n" À» »ç¿ëÇÏ¸é µÈ´Ù. "n" Àº È÷½ºÅ丮 ¹øÈ£ÀÌ´Ù. Áï make clean À» ´Ù½Ã ½ÇÇàÇÏ°í ½Í´Ù¸é "!3" ÇÏ¸é µÈ´Ù. "!" ´Â È÷½ºÅ丮 ±â´ÉÀ» »ç¿ëÇϱâ À§ÇÑ ½© ¿¹¾à¾îÀÌ´Ù. ÀÌ°É »ç¿ëÇϸé ÀÛ¾÷À» ÆíÇÏ°Ô ÇÒ¼ö ÀÖ´Ù. "!(¹®ÀÚ¿­)" ÇÏ°Ô µÇ¸é, È÷½ºÅ丮 ¸ñ·ÏÁß¿¡¼­ (¹®ÀÚ¿­)·Î ½ÃÀ۵Ǵ °¡Àå ÃÖ±Ù¿¡ ½ÇÇàµÈ È÷½ºÅ丮ÀÇ ¸í·É¾î¸¦ ºÒ·¯¿Í¼­ ½ÇÇàÇÏ°Ô µÈ´Ù. À§¿¡¼­ 454 ¹øÀÇ ¸í·ÉÀ» ´Ù½Ã ½ÇÇàÇÏ°í ½Í´Ù¸é, !vi ÇÏ¸é µÈ´Ù. ¹°·Ð !v Çصµ °ü°è¾ø´Ù. È÷½ºÅ丮´Â grep °ú Á¶ÇյǾ ÀÚÁÖ »ç¿ëÇÑ´Ù. [root@localhost /root]# history | grep configure 8 ./configure --with-apache=../apache-1.3.22 13 ./configure 14 ./configure i686-linux 15 ./configure --help [root@localhost /root]# !8 ./configure --with-apache=../apache-1.3.22
ÃÖ±Ù¸í·É¾î ġȯ ¾Æ·¡¿Í °°Àº »óȲÀ» °¡Á¤Çغ¸ÀÚ [root@localhost /]# vp file1 file2 bash: vp: command not found »ç½ÇÀº file1 À» file2 ·Î º¹»çÇÏ´Â ÀÛ¾÷À» ÇÏ±æ ¿øÇßÀ¸³ª, cp ¸¦ vp ·Î Ä¡´Â ¿À·ù¸¦ ¹üÇß´Ù. À̸¦ Á¤Á¤Çϱâ À§Çؼ­´Â óÀ½ºÎÅÍ ´Ù½ÃÄ¡°Å³ª, ÀÚÆÇÀ» "v" ±îÁö ¿òÁ÷ ¿©¼­ À̸¦ "c"·Î ±³Ã¼ ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·²°æ¿ì "^"¸¦ »ç¿ëÇϸé ÀÛ¾÷À» Á»´õ »¡¸® ÇÒ¼ö ÀÖ´Ù. [root@localhost /]# ^v^c cp file1 file2 "^[¿øº»¹®ÀÚ¿­]^[¹Ù²ð¹®ÀÚ¿­]" ÀÇ Çü½ÄÀ¸·Î »ç¿ëÇϸé, °¡Àå ÃÖ±ÙÀÇ ¸í·É¿¡¼­ ¿øº»¹®ÀÚ¿­À» ¹Ù²ð¹®ÀÚ¿­·Î ġȯÇÏ¿© ¸í·ÉÀ» ´Ù½Ã ½ÇÇàÇÏ°Ô µÈ´Ù.
Prompt Prompt ¶õ ½©ÀÌ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ±â´Ù¸®°í ÀÖÀ½À» À¯Àú¿¡°Ô ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù. Prompt ¸¦ Àß »ç¿ëÇÏ°Ô µÇ¸é ¿©·¯ºÐÀÌ ¾î¶² È£½ºÆ® ¿¡¼­ ÀÛ¾÷À» ÇÏ´ÂÁö, ȤÀº ¸î½ÃÀÎÁö, ¾î¶² µð·ºÅ丮¿¡¼­ ÀÛ¾÷ÇÏ°í ÀÖ´ÂÁö µîÀÇ ÀÛ¾÷Á¤º¸µîÀ» ¾òÀ»¼ö ÀÖ´Ù. ÇÁ·ÒÇÁÆ® Á¤º¸´Â ȯ°æº¯¼ö PS1 ¿¡ ÀúÀåµÈ´Ù. echo $PS1 ÇØ º¸¸é ÇöÀç ¼³Á¤µÈ ÇÁ·ÒÇÁÆ® Á¤º¸¸¦ º¼¼ö ÀÖ´Ù. bash ´Â È¿À²ÀûÀÎ ÇÁ·ÒÇÁÆ® Á¤º¸¸¦ º¸¿©ÁÖ±â À§Çؼ­ ¸î°³ÀÇ Æ¯¼ö ¹®ÀÚ µéÀ» Á¦°øÇÏ°í ÀÖ´Ù. Prompt ¿¹¾à¾î \t ÇöÀç ½Ã°£À» HH:MM:SS Çü½ÄÀ¸·Î º¸¿©ÁØ´Ù. \d ³¯ÀÚ¸¦ "¿äÀÏ ¿ù ÀÏ" Çü½ÄÀ¸·Î º¸¿©ÁØ´Ù. \s ½©ÀÇ À̸§À» º¸¿©ÁØ´Ù. \w ÇöÀç ÀÛ¾÷µð·ºÅ丮¸¦ ¿ÏÀü°æ·Î·Î º¸¿©ÁØ´Ù. \W ÇöÀç ÀÛ¾÷µð·ºÅ丮ÀÇ À̸§À» º¸¿©ÁØ´Ù. \u ÇöÀç »ç¿ëÀÚÀÇ »ç¿ëÀÚ¸í \h È£½ºÆ®À̸§ \! ÀÌ ¸í·ÉÀÇ È÷½ºÅ丮 ¹øÈ£ \nnn 8Áø¼ö nnn¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ \[ ºñÃâ·Â¹®ÀÚÀÇ ½ÃÄö½º¸¦ ½ÃÀÛÇÑ´Ù. \] ºñÃâ·Â¹®ÀÚÀÇ ½ÃÄö½º¸¦ ¸¶Ä£´Ù.
°£´ÜÇÑ ¿¹¸¦ µé¾îº¸ÀÚ. ¿ì¸®´Â Prompt »ó¿¡ ÇöÀç ½Ã°£°ú, ÀÛ¾÷µð·ºÅ丮 Á¤º¸¸¦ º¸¿©ÁÖ±æ ¿øÇÑ´Ù. ÀÌ·²¶§´Â ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù. [root@localhost httpd]# export PS1="[\t \W]# " [17:40:37 html]# echo "¼º°øÀûÀ¸·Î ¹Ù²¼±º¿ä"
Prompt Àü¿¡ ¸í·É ½ÇÇà½ÃÅ°±â ÀÌ·¸°Ô Çؼ­ ÇÁ·ÒÇÁÆ®¸¦ º¯°æ½ÃÅ°´Â¹æ¹ýÀ» ¾Ë¾Ò´Ù. ±×·±µ¥, ¾î¶² ÇÑÅÒ ÀÇ °æ¿ì ÇÑÅÒÀÇ Å¸ÀÌƲ¹Ù Á¦¸ñÀÌ ½Ã½Ã°¢°¢ ¹Ù²î´Â°ÍÀ» º»ÀûÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ°Ç ¾î¶»°Ô Çϴ°ÍÀϱî. ? ÀÌ°Ç bash ½©ÀÇ È¯°æº¯¼öÀÎ PROMPT_COMMAND ¸¦ »ç¿ëÇÏ¿© °¡´ÉÇÏ´Ù. PROMPT_COMMAND ¿¡´Â ƯÁ¤ ¸í·É¾î(½ºÆ®¸³Æ® ȤÀº ½ÇÇàÆÄÀÏ)°¡ °ªÀ¸·Î µé¾î°¡ Àִµ¥, »ç¿ëÀÚ¿¡°Ô ÇÁ·ÒÇÁÆ®°¡ ¶³¾îÁö±â Àü¿¡ º¯¼ö¿¡ ÀÖ´Â ¸í·ÉÀÌ ½ÇÇàµÈ´Ù. [root@localhost /root]# export PROMPT_COMMAND="date" ¿ù 11¿ù 19 17:51:03 KST 2001 [root@localhost /root]# echo "hello world" hello world ¿ù 11¿ù 19 17:51:19 KST 2001 [root@localhost /root]# À§ÀÇ ¿¹¿¡¼­ º¸´Ù½ÃÇÇ »ç¿ëÀÚ ÇÁ·ÒÇÁÆ®°¡ ¶³¾îÁú¶§ ¸¶´Ù, ±×Àü¿¡ "date" ¸í·ÉÀÌ ½ÇÇàµÊÀ» ¾Ë¼ö ÀÖ´Ù. ÀÌ ¸í·ÉÀ» ¾à°£ º¯°æÇϸé ŸÀÌƲ¹Ù°¡ ±×¶§±×¶§ ¹Ù²îµµ·Ï ¼³Á¤ ÇÒ¼ö ÀÖ´Ù. [root@localhost /home]# export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"' À§ÀÇ °æ¿ì µð·ºÅ丮°¡ º¯°æµÉ¶§ ¸¶´Ù ÀÛ¾÷µð·ºÅ丮°¡ ŸÀÌƲ¹Ù¿¡ Ç¥½Ã °¡µÈ´Ù. À§ÀÇ ³»¿ëÀ» /etc/bashrc Á¤µµ¿¡ ÀÔ·ÂÇØ ³õÀ¸¸é âÀ» ¶ç¿ï¶§ ¸¶´Ù ȯ°æº¯¼öÀÇ ³»¿ëÀÌ Àû¿ëµÉ°ÍÀÌ´Ù. ÇÏÁö¸¸ ´Ü¼øÈ÷ »ç¿ëÀÚ¿¡°Ô ½Ã°¢ÀûÀ¸·Î ±×·²µíÇÏ°Ô º¸¿©ÁÖ´Â°Í ¿Ü¿¡µµ PROMPT_COMMAND ¸¦ ÀÀ¿ëÇϸé Á»´õ ´Ù¾çÇÑ ÀϵéÀ» ÇÒ¼ö ÀÖ´Ù. ´ÙÀ½Àå¿¡¼­ ÀÌ¿¡ ´ëÇؼ­ °£´ÜÇÏÁö¸¸ À¯¿ëÇÑ ÇÑ°¡Áö ¿¹¸¦ µé¾î º¸µµ·Ï ÇÏ°Ú´Ù.
PROMPT_COMMAND ¸¦ ÀÌ¿ëÇÑ »ç¿ëÀÚ ¸í·É¾î ÃßÀû ¿äÁò ÄÄÅ;÷°è ÃÖ´ëÀÇ È­µÎ´Â "º¸¾È"ÀÌ´Ù. ÀÌ·± ´ë¼¼¿¡ ¸ÂÃ߾ »ç¿ëÀÚ°¡ ÇöÀç ¹«½¼ ¸í·ÉÀ» »ç¿ëÁß¿¡ ÀÖ´ÂÁö ½Ç½Ã°£À¸·Î È®ÀÎÇÒ¼ö ÀÖ´Â °£´ÜÇÑ º¸¾È ÇÁ·Î±×·¥? À» ÀÛ¼ºÇغ¸µµ·Ï ÇÏ°Ú´Ù. º¸Åë ÀÌ·¯ÇÑ »ç¿ëÀÚ ¸í·ÉÀ» ½Ç½Ã°£À¸·Î ÃßÀûÇÏ´Â ÇÁ·Î±×·¥À» º¸¾È½© À̶ó°í ÇÑ´Ù. - ¹°·Ð ½ÇÁö º¸¾È½©¿¡´Â ÀÌ¿Ü¿¡µµ, ÆÄÀϺ¸¾È, µð·ºÅ丮 º¸¾È, ÇÁ·Î¼¼½ºº¸¾È µî°ú °°Àº ´Ù¾çÇÑ ±â´ÉÀÌ µé¾î°¡Áö¸¸ ¿©±â¼­´Â »ç¿ëÀÚÀÇ ÀÛ¾÷³»¿ëÀ» ½Ç½Ã°£À¸·Î È®ÀÎÇÒ¼ö ÀÖ´Â ±â´É¸¸ ±¸ÇöÇÏ°Ú´Ù - º¸Åë º¸¾È½©À» ¸¸µå´Âµ¥´Â ¸¹Àº ½Ã°£°ú Àγ»½ÉÀÌ ÇÊ¿äÇÏÁö¸¸, ½©ÀÇ Æ¯Â¡À» Á¶±Ý¸¸ ¾Ë°í ÀÖ´Ù¸é, ½Ã°£°ú ³ë·ÂÀ» ´ÜÃà½Ãų¼ö°¡ ÀÖ´Ù. PROMPT_COMMAND ¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀº ¸Å¿ì °£´ÜÇÏ´Ù. »ç¿ëÀÚÀÇ ÇÁ·ÒÇÁÆ®°¡ ¶³¾îÁ³À»¶§, »ç¿ëÀÚÀÇ À̸§, »ç¿ëÀÚÀÇ °¡Àå ÃÖ±ÙÀÇ ¸í·É¾îµîÀ» °¡Á®¿Í¼­ À̸¦ ÆÄÀÏ·Î ¸¸µé°Å³ª ¼ÒÄÏÀ» ÅëÇؼ­, °ü¸®ÀÚ¿¡°Ô Å뺸Çϵµ·Ï ÇÏ¸é µÈ´Ù. ½©¿¡¼­´Â ¹°·Ð history¶ó´Â°É Á¦°øÇϱä ÇÏÁö¸¸, history ´Â ½Ç½Ã°£ÀÌ ¾Æ´Ï´Ù. ÀÏ´ÜÀº ½©ÀÇ ¸Þ¸ð¸®¿¡¼­ °ü¸®ÇÏ°í ÀÖ´Ù°¡, ·Î±×¾Æ¿ô ÇÏ¸é ±×¶§ ÆÄÀÏ·Î ÀúÀåÀÌ µÈ´Ù. Áï ·Î±×¾Æ¿ô Çϱâ Àü±îÁö´Â ¹«½¼ÀÏÀ» ÇÏ´ÂÁö Åë ¾Ë¼ö°¡ ¾ø°Ô µÈ´Ù. ±×¸®°í history ¸í·ÉÀ» ÀÌ¿ëÇؼ­ ÆíÁý °¡´ÉÇÏ´Ù. ´ÙÀ½°ú °°ÀºÀ̸§À¸·Î moniter.sh ¶õ °£´ÜÇÑ ½ºÅ©¸³Æ® ÆÄÀÏÀ» ÀÛ¼ºÇÑ´Ù. LAST_COMMAND=`tail -1 /root/dump` CURRENT_COMMAND=`history 1` if [ "$LAST_COMMAND" != "$CURRENT_COMMAND" ] then echo "$CURRENT_COMMAND" >> /root/dump fi À§ÀÇ ½ºÅ©¸³Æ®¸¦ Àû´çÇÑ µð·ºÅ丮¿¡ º¹»çÇÑ´ÙÀ½¿¡, °¢ »ç¿ëÀÚ°¡ ·Î±×ÀÎÇÒ¶§ ȯ°æº¯¼ö·Î ÃʱâÈ­ ½ÃÅ°¸é µÈ´Ù. export PROMPT_COMMAND="/usr/bin/moniter.sh" ¹°·Ð À§ÀÇ ÇÁ·Î±×·¥¿¡´Â ¿©·¯°¡Áö ºÎÁ·ÇÑÁ¡ÀÌ ¸¹´Ù. ¸¶Áö¸· ¸í·ÉÀÌ È­ÀÏ·Î ÀúÀåµÇ¸ç, ¶ÇÇÑ »ç¿ëÀÚ°¡ ½©ÀÇ Æ¯¼ºÀ» À߾˰í ÀÖ°í, ¿©±â¿¡ ÁÖÀǸ¦ ±â¿ïÀδٸé ȯ°æº¯¼ö¸¦ ºÐ¼®Çؼ­ À̸¦ Á¶ÀÛÇÒ¼ö ÀÖ´Ù. ÀÌ´Â ¿©·¯°¡Áö ¹æ¹ýÀ» ÅëÇؼ­ ÇØ°áÇÒ¼ö ÀÖÁö¸¸, ÀÌ´Â ½©½ºÅ©¸³ÆÃÀÇ ¹üÀ§¸¦ ¹þ¾î³ª´Â °ÍÀÓÀ¸·Î, °£´ÜÈ÷ ÀÌ·¯ÇÑ ÀÏÀ» ÇÒ¼öµµ ÀÖ´Ù¶ó´Â °Í¸¸ ÀÌÇØÇØ µÎ±â·Î ÇÏÀÚ. ÀÌ ±ÛÀ» Àд ¿©·¯ºÐÀÌ ÁÁÀº ¹æ¹ýÀ» »ý°¢ÇØ º¸±â ¹Ù¶õ´Ù. (¹°·Ð °¡Àå ÁÁÀº ¹æ¹ýÀº ½© ½î¾²¸¦ ¼öÁ¤ÇÏ´Â °Å´Ù. »ý°¢¸¸Å­ º¹ÀâÇÏÁö ¾ÊÀ¸´Ï ¿¬±¸ÇØ º¸½Ã±æ..)