3.24. Here Documents

here document´Â ftp, telnet, exó·³ »ç¿ëÀÚ¿Í ÀÔ·ÂÀ» ÁÖ°í ¹Þ´Â ÇÁ·Î±×·¥(interactive)¿¡°Ô ¸í·É¾î ½ºÅ©¸³Æ®¸¦ ÀνĽÃų ¼ö ÀÖ°Ô Çϱâ À§Çؼ­ I/O ÀçÁöÇâ(3.13절 Âü°í)ÀÇ Æ¯º°ÇÑ ÇüŸ¦ »ç¿ëÇÕ´Ï´Ù. ½ºÅ©¸³Æ®´Â º¸Åë, ƯÁ¤ ÇÁ·Î±×·¥¿¡ ³Ñ±æ ¸í·É¾îµéÀ» Á¦ÇÑ ¹®ÀÚ¿­(limit string)·Î ±¸ºÐÇØ¼­ Ç¥ÇöÇÕ´Ï´Ù. Ưº°ÇÑ ½Éº¼ÀÎ << µÚ¿¡ Á¦ÇÑ ¹®ÀÚ¿­À» Àû¾î ÁÝ´Ï´Ù. ÀÌ·¸°Ô ÇØ¼­ Ãâ·Â ÆÄÀÏÀ» ±× ÇÁ·Î±×·¥À¸·Î ÀçÁöÇâ ½ÃŰ°Ô µË´Ï´Ù. Áï, ´ÙÀ½°ú ºñ½ÁÇÑ ÇüŰ¡ µË´Ï´Ù.
interactive-program < command-file
¿©±â¼­ command-file¿¡´Â
command #1
command #2
...
µéÀ» Æ÷ÇÔÇÕ´Ï´Ù.

"here document"¸¦ ¾´´Ù¸é ÀÌ·¸°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù.
#!/bin/bash
interactive-program <<LimitString
command #1
command #2
...
LimitString

Á¦ÇÑ ¸í·É¾î´Â ¾î¶² ¸í·É¾î ¸ñ·Ï¿¡¼­µµ ³ªÅ¸³ªÁö ¾ÊÀ» ¾ÆÁÖ ÀϹÝÀûÀÌÁö ¾Ê´Â ¹®ÀÚ¿­·Î °ñ¶ó¾ß ÇÒ °ÍÀÔ´Ï´Ù. ±×·¸°Ô ¾È Çϸé ÀÏÀÌ ¾ÆÁÖ º¹ÀâÇØ Áý´Ï´Ù.

"here documents"´Â »ç¿ëÀÚ¿Í ´ëÈ­ÇÏÁö ¾Ê´Â(non-interactive) À¯Æ¿¸®Æ¼³ª ¸í·É¾î¿Í ¾µ ¶§ ´õ ÁÁÀº È¿°ú°¡ ÀÖ´Ù´Â °Í¿¡ ÁÖÀÇÇϼ¼¿ä.

예 3-92. dummyfile: µÎ ÁÙÂ¥¸® ´õ¹Ì ÆÄÀÏ ¸¸µé±â

#!/bin/bash

# ÆÄÀÏÀ» ÆíÁýÇϱâ À§ÇØ 'vi'¸¦ ºñ»óÈ£´ëÈ­ ¸ðµå·Î »ç¿ë
# 'sed'¸¦ Èä³»³¿.

if [ -z $1 ]
then
  echo "»ç¿ë¹ý: `basename $0` filename"
  exit 1
fi

TARGETFILE=$1

vi $TARGETFILE <<x23LimitStringx23
i
¿¹Á¦ ÆÄÀÏ¿¡¼­ ù¹øÂ° ÁÙÀÔ´Ï´Ù.
¿¹Á¦ ÆÄÀÏ¿¡¼­ µÎ¹øÂ° ÁÙÀÔ´Ï´Ù.
^[
ZZ
x23LimitStringx23

# À§¿¡¼­ ^[ ´Â Control-V¿Í Escape ۸¦ ¼ø¼­´ë·Î ´­·ÈÀ» ¶§ ³ªÅ¸³ª´Â Ç¥½ÃÀÔ´Ï´Ù.

exit 0

À§ ½ºÅ©¸³Æ®´Â viº¸´Ù ex¸¦ ½á¼­ ±¸ÇöÇß´Ù¸é ´õ È¿°úÀûÀÔ´Ï´Ù. ex ¸í·É¾î ¸ñ·ÏÀ» ½ÇÇàÇÏ´Â here document´Â ex ½ºÅ©¸³Æ®(ex scripts)¶ó°í ¾Ë·ÁÁ® ÀÖ´Â ÇüÅ·Π¸¸µé¾îµµ ÃæºÐÇÕ´Ï´Ù.

예 3-93. broadcast: ·Î±×ÀÎ ÇØ ÀÖ´Â ¸ðµç »ç¿ëÀÚ¿¡°Ô ¸Þ¼¼Áö¸¦ º¸³»±â

#!/bin/bash

wall <<zzz23EndOfMessagezzz23
Áß¾Ó º»ºÎ¿¡¿¡¼­ º¸¿À³»¾Ö´ÀÀº ¸Þ¼¼ÁöÀÌÀÔ´ÏÀÌ´Ù.
¹«½º¸¦ ÁÖ±âÁö ¸¶¼¼¿ä!
# ´Ù¸¥ ¸Þ¼¼Áöµµ º¸³¾ ¼ö ÀÖ½À´Ï´Ù.
# ÁÖÀÇ: 'wall'Àº ÁÖ¼®µµ ¸Þ¼¼Áö·Î ³»º¸³À´Ï´Ù.
zzz23EndOfMessagezzz23

# wall <message-file ó·³ ÇØ¼­ ´õ È¿°úÀûÀ¸·Î ÇÒ ¼ö ÀÖ½À´Ï´Ù.

exit 0

예 3-94. catÀ¸·Î ¿©·¯ ÁÙÀÇ ¸Þ¼¼Áö Ãâ·Â

#!/bin/bash

# 'echo' ´Â ÇÑ ÁÙÂ¥¸® ¸Þ¼¼Áö¸¦ Âï±â¿¡ ¾ÆÁÖ ÁÁ½À´Ï´Ù¸¸,
# ¿©·¯ÁÙÀÇ ¸Þ¼¼Áö¸¦ ÂïÀ¸·Á¸é ¹®Á¦°¡ ¸¹½À´Ï´Ù.
# 'cat'À» ÀÌ¿ëÇÑ "here document"°¡ ÀÌ ¹®Á¦¸¦ ÇØ°áÇØ ÁÝ´Ï´Ù.

cat <<End-of-message
-------------------------------------
¸Þ¼¼ÁöÀÇ Ã¹ ¹øÂ°ÁÙÀÔ´Ï´Ù.
¸Þ¼¼ÁöÀÇ µÎ ¹øÂ°ÁÙÀÔ´Ï´Ù.
¸Þ¼¼ÁöÀÇ ¼¼ ¹øÂ°ÁÙÀÔ´Ï´Ù.
¸Þ¼¼ÁöÀÇ ³× ¹øÂ°ÁÙÀÔ´Ï´Ù.
¸Þ¼¼ÁöÀÇ ¸¶Áö¸· ÁÙÀÔ´Ï´Ù.
-------------------------------------
End-of-message

exit 0

예 3-95. upload: "Sunsite" incoming µð·ºÅ丮¿¡ ÆÄÀÏ ÇÑ ½ÖÀ» ¾÷·Îµå

#!/bin/bash

# ¾÷·Îµå
# ÆÄÀÏ µÎ °³(filename.lsm, filename.tar.gz)¸¦ 
# Sunsite incoming µð·ºÅ丮¿¡ ¾÷·Îµå


if [ -z $1 ]
then
  echo "»ç¿ë¹ý: `basename $0` filename"
  exit 1
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
# °¢ ÆÄÀÏ Àü¼ÛÀÌ ³¡³¯¶§¸¶´Ù 'bell'À» ¿ï·ÁÁÝ´Ï´Ù.
cd $Directory
put $Filename.lsm
put $Filename.tar.gz
bye
End-Of-Session

exit 0

참고: ¸î¸î À¯Æ¿¸®Æ¼µéÀº "here document"¿¡¼­ Àß µ¿ÀÛÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ÆäÀÌÁ®ÀÎ more³ª less°¡ À̵éÁß ÇϳªÀÔ´Ï´Ù.

"here document"·Î Çϱ⿡ ³Ê¹« º¹ÀâÇÒ °Í °°Àº ÀÏ¿¡´Â expect ½ºÅ©¸³Æ® ¾ð¾î¸¦ °í·ÁÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù. expect´Â »ç¿ëÀÚ¿Í »óÈ£ ´ëÈ­ÇÏ´Â ÇÁ·Î±×·¥¿¡°Ô µü ¸Â´Â ÀÔ·ÂÀ» Á¦°øÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù.