17Àå. Here Documents

here codument´Â I/O ÀçÁöÇâÀÇ Æ¯º°ÇÑ ÇüÅ·μ­, ftp³ª telnet, exó·³ »ç¿ëÀÚ¿Í ÀÔ·ÂÀ» ÁÖ°í ¹Þ´Â(interactive) ÇÁ·Î±×·¥¿¡°Ô ¸í·É¾î ½ºÅ©¸³Æ®¸¦ ÀԷ½ÃÅ°´Âµ¥ ¾²ÀÔ´Ï´Ù. ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀ¸·Î ¾µ ¸í·É¾î ¸®½ºÆ®µé·Î ÀÌ·ç¾îÁø ½ºÅ©¸³Æ®´Â º¸Åë Á¦ÇÑ ¹®ÀÚ¿­(limit string)·Î Ç¥ÇöµË´Ï´Ù. Ưº°ÇÑ ½Éº¼ÀÎ << µÚ¿¡ Á¦ÇÑ ¹®ÀÚ¿­À» Àû¾î ÁÝ´Ï´Ù. "here document"´Â command-file¿¡
command #1
command #2
...
µîÀÌ Æ÷ÇԵǾî ÀÖ´Ù°í ÇßÀ» ¶§, interactive-program < command-file À̶ó°í Çؼ­ ÆÄÀÏÀÇ Ãâ·ÂÀ» ÇÁ·Î±×·¥À¸·Î ÀçÁöÇâ ½ÃÅ°´Â °Í°ú ºñ½ÁÇÑ °á°ú¸¦ °¡Á® ¿É´Ï´Ù.

"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) ÇÁ·Î±×·¥¿¡°Ô ¿øÇϴ´ë·Î ÀÔ·ÂÀ» ³Ö¾îÁÙ ¼ö ÀÖ°Ô ÇØ ÁÖ´Â ½ºÅ©¸³Æ® ¾ð¾îÀÔ´Ï´Ù.