here codument´Â I/O ÀçÁöÇâÀÇ Æ¯º°ÇÑ ÇüÅ·μ, ftp³ª telnet, exó·³ »ç¿ëÀÚ¿Í ÀÔ·ÂÀ» ÁÖ°í ¹Þ´Â(interactive) ÇÁ·Î±×·¥¿¡°Ô ¸í·É¾î ½ºÅ©¸³Æ®¸¦ ÀԷ½Ã۴µ¥ ¾²ÀÔ´Ï´Ù. ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀ¸·Î ¾µ ¸í·É¾î ¸®½ºÆ®µé·Î ÀÌ·ç¾îÁø ½ºÅ©¸³Æ®´Â º¸Åë Á¦ÇÑ ¹®ÀÚ¿(limit string)·Î Ç¥ÇöµË´Ï´Ù. Ưº°ÇÑ ½Éº¼ÀÎ << µÚ¿¡ Á¦ÇÑ ¹®ÀÚ¿À» Àû¾î ÁÝ´Ï´Ù. "here document"´Â command-file¿¡
command #1 command #2 ... |
"here document"·Î´Â ÀÌ·¸°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù:
#!/bin/bash interactive-program <<LimitString command #1 command #2 ... LimitString |
¾î¶² ¸í·É¾î ¸ñ·Ï¿¡¼µµ ³ªÅ¸³ªÁö ¾ÊÀ» ¸¸Å ÃæºÐÈ÷ ÀϹÝÀûÀÌÁö ¾ÊÀº Á¦ÇÑ ¹®ÀÚ¿À» °ñ¶ó¾ß¸¸ º¹ÀâÇÑ »óȲÀ» ÇÇÇÒ ¼ö ÀÖ½À´Ï´Ù.
here documents´Â ºñ´ëÈÇü ¸ðµå(non-interactive)·Î µµ´Â À¯Æ¿¸®Æ¼³ª ¸í·É¾î¿Í ¾µ ¶§ ´õ ÁÁÀº È¿°ú°¡ ³ªÅ¸³´Ù´Â °Í¿¡ ÁÖÀÇÇϼ¼¿ä.
¿¹ 17-1. dummyfile: µÎ ÁÙÂ¥¸® ´õ¹Ì ÆÄÀÏ ¸¸µé±â
#!/bin/bash # ÆÄÀÏ ÆíÁýÀ» À§ÇØ 'vi'¸¦ ºñ´ëÈ ¸ðµå·Î »ç¿ë. # ('vim'À¸·Î ÇÏ¸é ¸î °¡Áö ÀÌÀ¯¶§¹®¿¡ ¾È µË´Ï´Ù.) # 'sed'¸¦ ¿¡¹Ä·¹ÀÌÆ®ÇÔ. E_BADARGS=65 if [ -z "$1" ] then echo "»ç¿ë¹ý: `basename $0` filename" exit $E_BADARGS fi TARGETFILE=$1 # ÆÄÀÏ¿¡ µÎ ÁÙÀ» »ðÀÔÇÑ ´ÙÀ½ ÀúÀå. #--------here document ½ÃÀÛ-----------# vi $TARGETFILE <<x23LimitStringx23 i ¿¹Á¦ ÆÄÀÏÀÇ Ã¹¹øÂ° ÁÙÀÔ´Ï´Ù. ¿¹Á¦ ÆÄÀÏÀÇ µÎ¹øÂ° ÁÙÀÔ´Ï´Ù. ^[ ZZ x23LimitStringx23 #----------here document ³¡-----------# # À§¿¡¼ ^[ ´Â Control-V ¿Í Escape ¸¦ ¼ø¼´ë·Î ´·¶À» ¶§ ³ªÅ¸³ª´Â Ç¥½ÃÀÔ´Ï´Ù. exit 0 |
À§ÀÇ ½ºÅ©¸³Æ®´Â viº¸´Ù ex¸¦ ½á¼ ±¸ÇöÇß´Ù¸é ´õ È¿°úÀûÀ̾úÀ» °Ì´Ï´Ù. ex ¸í·É¾îÀÇ ¸ñ·ÏÀ» °®°í ÀÖ´Â Here document¸¦ ex ½ºÅ©¸³Æ®À̶ó°í ºÎ¸£´Âµ¥ À̵éÀº ÃæºÐÈ÷ ÀڽŸ¸ÀÇ Ä«Å×°í¸®¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
¿¹ 17-2. broadcast: ·Î±×ÀÎ ÇØ ÀÖ´Â ¸ðµç »ç¶÷µé¿¡°Ô ¸Þ¼¼Áö º¸³»±â
#!/bin/bash wall <<zzz23EndOfMessagezzz23 Á¡½É¿¡ ÇÇÀÚ ¸Ô½À´Ï´Ù. ÁÖ¹® ÇÏ½Ç ºÐÀº ½Ã½ºÅÛ °ü¸®ÀÚÇÑÅ× À̸ÞÀÏÀ» º¸³»¼¼¿ä. (¸êÄ¡(anchovy, ¿Å±äÀÌ: À¹, ÀÌ·± ÅäÇεµ ÀÖ³ª¿ä?)³ª ¹ö¼¸ ÅäÇÎÀ» Ãß°¡ÇÏ½Ç ºÐÀº µ·À» ´õ ³»¼Å¾ß ÇÕ´Ï´Ù.) # ¸Þ¼¼Áö°¡ ´õ ÀÖ´Ù¸é ¿©±â¿¡ ÀûÀ¸¸é µË´Ï´Ù. # ÁÖÀÇ: 'wall'Àº ÀÌ ÁÖ¼®µéµµ ¸Þ¼¼Áö·Î ³»º¸³À´Ï´Ù. zzz23EndOfMessagezzz23 # wall <message-file ó·³ ÇØ¼ ´õ È¿°úÀûÀ¸·Î ÇÒ ¼ö ÀÖ½À´Ï´Ù. # ¾î·µç, ½ºÅ©¸³Æ®¿¡¼ ¸Þ¼¼Áö ÇüŸ¦ °áÁ¤ÇØ µÎ¸é, ¼ÕÀÌ ´ú °©´Ï´Ù. exit 0 |
¿¹ 17-3. catÀ¸·Î ¿©·¯ ÁÙÀÇ ¸Þ¼¼Áö ¸¸µé±â
#!/bin/bash # 'echo' ´Â ÇÑ ÁÙÂ¥¸® ¸Þ¼¼Áö¸¦ Âï±â¿¡ ¾ÆÁÖ ÁÁ½À´Ï´Ù¸¸, # ¿©·¯ÁÙÀÇ ¸Þ¼¼Áö¸¦ ÂïÀ¸·Á¸é ¹®Á¦°¡ ¸¹½À´Ï´Ù. # here document ¸¦ ÀÌ¿ëÇÑ 'cat'À» ¾²¸é ÀÌ ¹®Á¦°¡ ÇØ°áµË´Ï´Ù. cat <<End-of-message ------------------------------------- ¸Þ¼¼ÁöÀÇ Ã¹ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ µÎ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ¼¼ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ³× ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ¸¶Áö¸· ÁÙÀÔ´Ï´Ù. ------------------------------------- End-of-message exit 0 #------------------------------------------------------------- # À§¿¡¼ "exit 0"À» Ç߱⠶§¹®¿¡ ´ÙÀ½ ÄÚµå´Â ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù. # S.C. °¡ ´ÙÀ½Ã³·³ ÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù´Â °ÍÀ» ÁöÀûÇØ ÁÖ¾ú½À´Ï´Ù. echo "------------------------------------- ¸Þ¼¼ÁöÀÇ Ã¹ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ µÎ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ¼¼ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ³× ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ¸¶Áö¸· ÁÙÀÔ´Ï´Ù. -------------------------------------" # ÇÏÁö¸¸ 'echo'ÀÇ ³»¿ëÀÌ À̽ºÄÉÀÌÇÁµÇÁö ¾ÊÀ¸¸é Å«µû¿ÈÇ¥·Î Äõ¿ìÆ®µÇÁö ¾Ê¾Æµµ µË´Ï´Ù. |
here documentÀÇ Á¦ÇÑ ¹®ÀÚ¿¿¡ - ¿É¼ÇÀ» ºÙÀ̸é(<<-LimitString) Ãâ·Â¿¡¼ ÅÇÀ» Áö¿ö ÁÝ´Ï´Ù(ºó ÄÀº ¾Æ´Ô). ÀÌ°É ¾²¸é ½ºÅ©¸³Æ®¸¦ ÀбⰡ ÁÁ¾ÆÁý´Ï´Ù.
¿¹ 17-4. ÅÇÀÌ Áö¿öÁø ¿©·¯ ÁÙÀÇ ¸Þ¼¼Áö
#!/bin/bash # ¾ÕÀÇ ¿¹Á¦¿Í ¶È°°Áö¸¸... # here document ¿¡ - ¿É¼ÇÀ» ÁÖ¸é(<<-) # ¹®¼¾È¿¡ µé¾î ÀÖ´Â ÅÇÀ» ¹«½ÃÇØ ÁÝ´Ï´Ù. ÇÏÁö¸¸ ºó ÄÀº *¾Æ´Õ´Ï´Ù*. cat <<-ENDOFMESSAGE ¸Þ¼¼ÁöÀÇ Ã¹ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ µÎ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ¼¼ ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ³× ¹øÂ°ÁÙÀÔ´Ï´Ù. ¸Þ¼¼ÁöÀÇ ¸¶Áö¸· ÁÙÀÔ´Ï´Ù. ENDOFMESSAGE # ÀÌ ½ºÅ©¸³Æ®ÀÇ Ãâ·ÂÀº ¿ÞÂÊ¿¡ ºÙ¾î¼ ³ª¿É´Ï´Ù. # ¸Þ¼¼ÁöÀÇ ¾Õ¿¡ µé¾î ÀÖ´Â ÅÇÀº º¸ÀÌÁö ¾Ê½À´Ï´Ù. # À§ÀÇ 5ÁÙÂ¥¸® "message"´Â ¾Õ¿¡ ºó ÄÀÌ ¾Æ´Ï¶ó ÅÇÀÌ µé¾î ÀÖ½À´Ï´Ù. # ºó ÄÀº <<- ÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê½À´Ï´Ù. exit 0 |
here document´Â ¸Å°³º¯¼ö ġȯ°ú ¸í·É¾î ġȯÀ» Áö¿øÇÕ´Ï´Ù. µû¶ó¼ ¸Å°³º¯¼ö¿¡ µû¶ó ´Ù¸¥ Ãâ·ÂÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
¿¹ 17-5. Here document¿¡¼ ¸Å°³º¯¼ö ġȯÇϱâ
#!/bin/bash # ¸Å°³º¯¼ö ġȯÀ» ¾²´Â ´Ù¸¥ 'cat' here document. # ¸í·É¾îÁÙ ÀÎÀÚ¾øÀÌ ½ÇÇà½ÃÄÑ º¸¼¼¿ä, ./scriptname # ¸í·É¾îÁÙ ÀÎÀÚ¸¦ ÇÑ °³¸¸ Á༠½ÇÇà½ÃÄÑ º¸¼¼¿ä, ./scriptname Mortimer # µÎ ³¹¸»À» Äõ¿ìÆ®ÇØ¼ ¸í·É¾îÁÙ ÀÎÀÚ·Î Áຸ¼¼¿ä, ./scriptname "Mortimer Jones" CMDLINEPARAM=1 # ÃÖ¼ÒÇÑÀÇ ¸í·É¾îÁÙ ÀÎÀÚ. if [ $# -ge $CMDLINEPARAM ] then NAME=$1 # ¸í·É¾îÁÙ ÀÎÀÚ°¡ Çϳª ÀÌ»óÀ̶ó¸é, # ±×³É ù¹øÂ° ÀÎÀÚ¸¸ ¹Þ¾ÆµéÀÓ. else NAME="John Doe" # ¸í·É¾îÁÙ ÀÎÀÚ°¡ ¾øÀ» ¶§ÀÇ ±âº»°ª. fi RESPONDENT="ÀÌ ¸ÚÁø ½ºÅ©¸³Æ®ÀÇ ÀúÀÚ" cat <<Endofmessage ¾È³çÇϼ¼¿ä. $NAME ¾¾. Àü $RESPONDENT Àä, ¸¸³ª¼ ¹Ý°©½À´Ï´Ù. $NAME ¾¾. # ÀÌ ÁÖ¼®µµ Ãâ·ÂµË´Ï´Ù(¿ÖÀϱî¿ä?). Endofmessage # ºó ĵµ Ãâ·ÂµÇ±â ¶§¹®¿¡ "ÁÖ¼®"µµ Ãâ·ÂµË´Ï´Ù. ÁÖÀÇÇϼ¼¿ä. exit 0 |
here documentÀÇ ¾Õ¿¡ ³ª¿À´Â "Á¦ÇÑ ¹®ÀÚ¿"À» Äõ¿ìÆ® ÇØÁְųª À̽ºÄÉÀÌÇÁ ½ÃÄÑ ÁÖ¸é ³»ºÎ¿¡¼ ¸Å°³º¯¼ö ġȯÀÌ ¸ø ÀϾ°Ô ÇØ ÁÝ´Ï´Ù. ÀÌ°Ç °ÅÀÇ ¾µ¸ð°¡ ¾ø°ÚÁÒ.
¿¹ 17-6. ¸Å°³º¯¼ö ġȯ ²ô±â
#!/bin/bash # ¸Å°³º¯¼ö ġȯÀ» ²ö 'cat' here document. NAME="John Doe" RESPONDENT="ÀÌ ¸ÚÁø ½ºÅ©¸³Æ®ÀÇ ÀúÀÚ" cat <<'Endofmessage' ¾È³çÇϼ¼¿ä, $NAME ¾¾. Àü $RESPONDENT Àä, ¸¸³ª¼ ¹Ý°©½À´Ï´Ù. $NAME ¾¾. Endofmessage # "Á¦ÇÑ ¹®ÀÚ¿"(limit string)À» Äõ¿ìÆ® ÇØ Áְųª À̽ºÄÉÀÌÇÁ ½Ã۸é # ¸Å°³º¯¼ö ġȯÀÌ ÀϾÁö ¾Ê½À´Ï´Ù. # here document ½ÃÀۺκп¡¼ # cat <<"Endofmessage" # cat <<\Endofmessage # À̶ó°í ÇØµµ ¶È°°Àº °á°ú°¡ ³ª¿É´Ï´Ù. |
´ÙÀ½Àº ¸Å°³º¯¼ö ġȯÀ» ¾²´Â here document°¡ µé¾î ÀÖ´Â À¯¿ëÇÑ ½ºÅ©¸³Æ®ÀÔ´Ï´Ù.
¿¹ 17-7. upload: "Sunsite" incoming µð·ºÅ丮¿¡ ÆÄÀÏ ÇÑ ½ÖÀ» ¾÷·Îµå
#!/bin/bash # upload.sh # ÆÄÀÏ µÎ °³(Filename.lsm, Filename.tar.gz)¸¦ # Sunsite(metalab.unc.edu)ÀÇ incoming µð·ºÅ丮·Î ¾÷·Îµå. E_ARGERROR=65 if [ -z "$1" ] then echo "»ç¿ë¹ý: `basename $0` filename" exit $E_ARGERROR fi Filename=`basename $1` # ÆÄÀÏÀ̸§¿¡¼ °æ·Î¸íÀ» ¶¼¾î³»°í, Server="metalab.unc.edu" Directory="/incoming/Linux" # ÀÌ·¸°Ô ÇϵåÄÚµùÇÒ ÇÊ¿ä´Â ¾ø°í, # ¸í·É¾îÁÙ ÀÎÀڷΠó¸®Çϵµ·Ï ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. Password="your.e-mail.address" # ¾Ë¸Â°Ô °íÄ¡¼¼¿ä. ftp -n $Server <<End-Of-Session # -n ¿É¼ÇÀº ÀÚµ¿ ·Î±×ÀÎÀ» ¸·¾ÆÁÝ´Ï´Ù. user anonymous "$Password" binary bell # °¢ ÆÄÀÏ Àü¼ÛÀÌ ³¡³¯¶§¸¶´Ù 'º§'À» ¿ï·ÁÁÝ´Ï´Ù. cd $Directory put "$Filename.lsm" put "$Filename.tar.gz" bye End-Of-Session exit 0 |
:¸¦ ´õ¹Ì(dummy) ¸í·É¾î·Î ½á¼ here documentÀÇ Ãâ·ÂÀ» ¹Þ¾Æ µéÀÌ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é ½ÇÁ¦·Î´Â "¾Æ¹«°³"(anonymous) here document¸¦ ¸¸µé¾î ³À´Ï´Ù.
¿¹ 17-8. "¾Æ¹«°³"(anonymous) Here Document
#!/bin/bash : <<TESTVARIABLES ${HOSTNAME?}${USER?}${MAIL?} # º¯¼öÁß Çϳª¶óµµ ¼¼Æ®°¡ ¾È µÅ ÀÖÀ¸¸é ¿¡·¯ ¸Þ¼¼Áö¸¦ Ãâ·Â. TESTVARIABLES exit 0 |
Âü°í: Here documents´Â Àӽà ÆÄÀÏÀ» ¸¸µéÁö¸¸ »ç¿ëÈÄ Áö¿öÁö±â ¶§¹®¿¡ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇÒ ¼ö ¾ø½À´Ï´Ù.
bash$ bash -c 'lsof -a -p $$ -d0' << EOF > EOF lsof 1213 bozo 0r REG 3,5 0 30386 /tmp/t1213-0-sh (deleted)
°æ°í |
¸î¸î À¯Æ¿¸®Æ¼µéÀº here document ¾È¿¡¼ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù. |
"here document"·Î Çϱ⿡ ³Ê¹« º¹ÀâÇÑ ÀÛ¾÷µéÀº expect ½ºÅ©¸³Æ® ¾ð¾î¸¦ °í·ÁÇØ º¸±â ¹Ù¶ø´Ï´Ù. expect´Â »ç¿ëÀÚ¿Í ÀÔ·ÂÀ» ÁÖ°í ¹Þ´Â(interactive) ÇÁ·Î±×·¥¿¡°Ô ¿øÇϴ´ë·Î ÀÔ·ÂÀ» ³Ö¾îÁÙ ¼ö ÀÖ°Ô ÇØ ÁÖ´Â ½ºÅ©¸³Æ® ¾ð¾îÀÔ´Ï´Ù.