3.13. I/O ÀçÁöÇâ(I/O Redirection)

Ç×»ó ±âº»ÀûÀ¸·Î ¿­·ÁÀÖ´Â "ÆÄÀϵé"ÀÌ Àִµ¥, Ç¥ÁØÀÔ·Â(stdin)-(Űº¸µå), Ç¥ÁØÃâ·Â(stdout)-(½ºÅ©¸°), Ç¥ÁØ¿¡·¯(stderr)-(½ºÅ©¸°¿¡ »Ñ·ÁÁú ¿¡·¯ ¸Þ¼¼Áö)ÀÔ´Ï´Ù. ÀÌ ÆÄÀϵéÀ» Æ÷ÇÔÇØ¼­ ¾î¶² ¿­·Á ÀÖ´Â ÆÄÀÏÀÌ¶óµµ ÀçÁöÇâ µÉ ¼ö ÀÖ½À´Ï´Ù. ÀçÁöÇâÀ̶õ °£´ÜÈ÷ ¸»Çؼ­ ÆÄÀÏ, ¸í·É¾î, ÇÁ·Î±×·¥, ½ºÅ©¸³Æ®, ½ÉÁö¾î ½ºÅ©¸³Æ®¼ÓÀÇ ÄÚµå ºí·°ÀÇ Ãâ·Â(예 3-2, 예 3-3 Âü°í)À» Àâ¾Æ¼­ ´Ù¸¥ ÆÄÀÏ, ¸í·É¾î, ÇÁ·Î±×·¥, ½ºÅ©¸³Æ®ÀÇ ÀÔ·ÂÀ¸·Î º¸³»´Â °ÍÀÔ´Ï´Ù.

°¢°¢ÀÇ ¿­·Á ÀÖ´Â ÆÄÀÏÀº ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ÇÒ´ç¹Þ½À´Ï´Ù. [1] Ç¥ÁØÀԷ°ú Ç¥ÁØÃâ·Â, Ç¥ÁØ¿¡·¯¿¡ ´ëÇÑ ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â °¢°¢ 0, 1, 2 ÀÔ´Ï´Ù. Ãß°¡ÀûÀ¸·Î ¿­¸®´Â ÆÄÀÏÀ» À§Çؼ­ 3ºÎÅÍ 9±îÁö°¡ ³²°ÜÁ® ÀÖ½À´Ï´Ù. Á¾Á¾, ÀÌ Ãß°¡Àû ÆÄÀÏ µð½ºÅ©¸³Å͸¦ Ç¥ÁØÀÔ·Â, Ç¥ÁØÃâ·Â, Ç¥ÁØ¿¡·¯·Î ÇÒ´çÇØ¼­ Àӽ÷ΠÁߺ¹µÈ ¸µÅ©·Î ¾²´Â°ÍÀÌ À¯¿ëÇÒ ¶§°¡ ÀÖ½À´Ï´Ù. [2] ¾ÆÁÖ º¹ÀâÇÑ ÀçÁöÇâÀ̳ª ÆÄÀÏ µð½ºÅ©¸³ÅÍÀÇ º¹ÀâÇÑ »ç¿ëÈÄ¿¡ ¿ø·¡´ë·Î °£´ÜÇÏ°Ô º¹±¸½ÃÄÑ ÁÝ´Ï´Ù(예 3-72 Âü°í).

    >
      # Ç¥ÁØÃâ·ÂÀ» ÆÄÀÏ·Î ÀçÁöÇâ.
      # ¾ø´Â ÆÄÀÏÀ̶ó¸é ¸¸µé°í ÀÖ´Â ÆÄÀÏÀ̶ó¸é µ¤¾î ¾¹´Ï´Ù.

      ls -lR > dir-tree.list
      # µð·ºÅ丮 ±¸Á¶ ¸ñ·ÏÀ» ÆÄÀÏ·Î ÀúÀåÇØ ÁÝ´Ï´Ù.

    >>
      # Ç¥ÁØÃâ·ÂÀ» ÆÄÀÏ·Î ÀçÁöÇâ.
      # ¾ø´Â ÆÄÀÏÀ̶ó¸é ¸¸µé°í ÀÖ´Â ÆÄÀÏÀ̶ó¸é ÆÄÀÏ ³¡¿¡ µ¡ºÙÀÔ´Ï´Ù.

    2> &1
      # Ç¥ÁØ¿¡·¯¸¦ Ç¥ÁØÃâ·ÂÀ¸·Î ÀçÁöÇâ.
      # ¿ø·¡´Â ¾È º¸ÀÏ ¿¡·¯ ¸Þ¼¼ÁöµéÀ» º¸¿© ÁÝ´Ï´Ù.

    i> &j
      # i¹ø ÆÄÀÏ µð½ºÅ©¸³Å͸¦ j¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ·Î ÀçÁöÇâ.
      # i°¡ °¡¸£Å°´Â ÆÄÀÏÀÇ ¸ðµç Ãâ·ÂÀÌ j°¡ °¡¸£Å°´Â ÆÄÀÏ·Î º¸³»Áý´Ï´Ù.

    <
      # ÆÄÀÏ¿¡¼­ ÀÔ·Â ¹Þ°Ô ÇØ ÁÝ´Ï´Ù.
      # ">"¿Í ¦À» ÀÌ·ç´Â ¸í·É¾î·Î, Á¾Á¾ °°ÀÌ ¾²ÀÔ´Ï´Ù.
      grep search-word <filename

    |
      # ÆÄÀÌÇÁ.
      # ÀϹÝÀûÀÎ ¸ñÀûÀ¸·Î ¾²ÀÌ´Â, ÇÁ·Î¼¼½º¿Í ¸í·É¾î¸¦ ¹­¾î ÁÖ´Â Åø.
      # ">"¿Í ºñ½ÁÇÏÁö¸¸, ½ÇÁ¦·Î´Â Á» ´õ ÀϹÝÀûÀ¸·Î ¾²ÀÔ´Ï´Ù.
      # ¸í·É¾î, ½ºÅ©¸³Æ®, ÆÄÀÏ, ÇÁ·Î±×·¥µéÀ» ¹­´Âµ¥ À¯¿ëÇÏ°Ô ¾²ÀÔ´Ï´Ù.
      cat *.txt | sort | uniq > result-file
      # ¸ðµç *.txt ÆÄÀÏÀÇ Ãâ·ÂÀ» Á¤·ÄÇÑ ´ÙÀ½ Áߺ¹µÇ´Â ÁÙÀ» Á¦°ÅÇϰí 
      # ¸¶Áö¸·¿¡ °á°ú¸¦ "result-file"¿¡ ÀúÀå.

참고: ¿©·¯°³ÀÇ ÀÔÃâ·Â ÀçÁöÇâ°ú ÆÄÀÌÇÁ´Â ÇÑ ÁÙ¿¡¼­ °°ÀÌ ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù.

command < input-file > output-file

command1 | command2 | command3 > output-file

n<&-

n¹ø ÀÔ·Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ´Ý¾ÆÁÝ´Ï´Ù.

<&-

Ç¥ÁØÀÔ·ÂÀ» ´Ý½À´Ï´Ù.

n>&-

n¹ø Ãâ·Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ´Ý¾ÆÁÝ´Ï´Ù.

>&-

Ç¥ÁØÃâ·ÂÀ» ´Ý½À´Ï´Ù.

exec <filename´Â Ç¥ÁØÀÔ·ÂÀ» ÆÄÀÏ·Î ÀçÁöÇâ ½ÃÄÑÁÝ´Ï´Ù(º¸ÅëÀº Űº¸µå¿¡¼­ ¹Þ¾Æ µéÀÌÁö¸¸). ±× ¼ø°£ºÎÅÍ, ¸ðµç Ç¥ÁØÀÔ·ÂÀº ±× ÆÄÀÏ¿¡¼­ ¹Þ¾Æ µéÀÔ´Ï´Ù. ÀÌ·¸°Ô Çϸé sed³ª awk¿¡¼­ ÆÄÀÏÀ» ÁÙ ´ÜÀ§·Î ÀÐ¾î °¢ ÁÙÀ» ÆÄ½ÌÇÒ ¼ö ÀÖ°Ô ÇØ ÁÝ´Ï´Ù.

예 3-72. execÀ» ½á¼­ Ç¥ÁØÀÔ·Â ÀçÁöÇâ Çϱâ

#!/bin/bash
# 'exec'·Î Ç¥ÁØÀÔ·Â ÀçÁöÇâ Çϱâ.


exec 6<&0   # Ç¥ÁØÀÔ·ÂÀ» 6¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ·Î ÀúÀå

exec < data-file   # Ç¥ÁØÀÔ·ÂÀº "data-file"·Î º¯°æµÊ

read a1   # "data-file" ÀÇ Ã¹¹øÂ° ÁÙÀ» ÀÐÀ½
read a2   # "data-file" ÀÇ µÎ¹øÂ° ÁÙÀ» ÀÐÀ½

echo
echo "´ÙÀ½Àº ÆÄÀÏ¿¡¼­ ÀÐ¾î µéÀÎ °ÍÀÔ´Ï´Ù."
echo "-----------------------------------"
echo $a1
echo $a2

echo; echo; echo

exec 0<&6   # 6¹ø¿¡ ÀúÀåµÅ ÀÖ´ø Ç¥ÁØÀÔ·ÂÀ» º¹±¸½Ã۰í

echo -n "µ¥ÀÌŸ¸¦ ³ÖÀ¸¼¼¿ä "
read b1  # ÀÌÁ¦ "read"´Â ¿ì¸®°¡ ¹Ù¶ó´ø´ë·Î º¸ÅëÀÇ Ç¥ÁØÀԷ¿¡¼­ ÀоîµéÀÔ´Ï´Ù.
echo "Ç¥ÁØÀԷ¿¡¼­ ÀÐÀº ÀԷ°ª."
echo "-------------------------"
echo "b1 = $b1"

echo

exit

while, until, for·çÇÁµéÀÇ ÄÚµå ºí·°, ½ÉÁö¾î´Â if/then Å×½ºÆ® ºí·°µéµµ Ç¥ÁØÀÔ·ÂÀÇ ÀçÁöÇâÀ» ¹Þ¾Æ µéÀÏ ¼ö ÀÖ½À´Ï´Ù. ±× ÄÚµå ºí·°ÀÇ Á¦ÀÏ ³¡¿¡ < ¿¬»êÀÚ¸¦ µÎ¸é À̰ÍÀÌ °¡´ÉÇØ Áý´Ï´Ù.

예 3-73. ÀçÁöÇâµÈ while ·çÇÁ

#!/bin/bash

if [ -z $1 ]
then
  Filename=names.data  # ÆÄÀÏ À̸§ÀÌ ÁÖ¾îÁöÁö ¾ÊÀ» °æ¿ì ¾µ ±âº»°ª
else
  Filename="$1"
fi  

while [ "$name" != Smith ]  # ¿Ö $name À» Àοë(quote) ÇßÀ»±î¿ä?
do
  read name        # Ç¥ÁØÀÔ·ÂÀÌ ¾Æ´Ñ $Filename ¿¡¼­ ÀнÀ´Ï´Ù.
  echo $name
done <$Filename   # Ç¥ÁØÀÔ·ÂÀÌ $Filename À¸·Î ÀçÁöÇ⠵ƽÀ´Ï´Ù.

exit 0

예 3-74. ÀçÁöÇâµÈ until ·çÇÁ

#!/bin/bash
# ¹Ù·Î ¾Õ¿¡¼­ ±¸ÇöÇß´ø °ÍÀ» "until"·Î ±¸ÇöÇÑ ¿¹Á¦.

if [ -z $1 ]
then
  Filename=names.data  # ÆÄÀÏ À̸§ÀÌ ÁÖ¾îÁöÁö ¾Ê¾ÒÀ» °æ¿ì ¾µ ±âº»°ª
else
  Filename="$1"
fi  

# while [ "$name" != Smith ]
until [ "$name" = Smith ]     # != ¸¦  = ·Î ¹Ù²ãÁÖ¼¼¿ä.
do
  read name        # Ç¥ÁØÀÔ·ÂÀÌ ¾Æ´Ñ $Filename ¿¡¼­ ÀÐ¾î µéÀÔ´Ï´Ù.
  echo $name
done <$Filename   # Ç¥ÁØÀÔ·ÂÀ» $Filename À¸·Î ÀçÁöÇâ.

# ¾ÕÀÇ "while" ·çÇÁ¿Í °°Àº °á°ú

exit 0

예 3-75. ÀçÁöÇâµÈ for ·çÇÁ

#!/bin/bash

if [ -z $1 ]
then
  Filename=names.data  # ÆÄÀÏ À̸§ÀÌ ÁÖ¾îÁöÁö ¾Ê¾ÒÀ» °æ¿ì ¾µ ±âº»°ª
else
  Filename="$1"
fi  

line_count=`wc $Filename | awk '{ print $1 }'`  # ÇØ´ç ÆÄÀÏÀÇ ÁÙ ¼ö
# "for" ·çÇÁ¿¡¼­ Ç¥ÁØÀÔ·ÂÀ» ÀçÁöÇâ ÇÏ´Â°Ô ¾ÆÁÖ ºÎÀÚ¿¬½º·¯¿ö º¸ÀÌ°í ±¸ÇöÇϱâ 
# ±î´Ù·Ó°ÚÁö¸¸, ¿©·¯ºÐÀÌ ÃæºÐÈ÷ ¶È¶ÈÇÏ´Ù¸é °¡´ÉÇÏ´Ù´Â °ÍÀ» º¸¿©ÁÝ´Ï´Ù.


for name in `seq $line_count`  # "seq"°¡ ¿¬¼ÓµÈ ¼ýÀÚ¸¦ Âï¾î³½´Ù´Â °Å, ±â¾ï³ª½ÃÁÒ? 
# while [ "$name" != Smith ]   --   "while" ·çÇÁº¸´Ù ´õ º¹ÀâÇÕ´Ï´Ù.
do
  read name        # Ç¥ÁØÀÔ·ÂÀÌ ¾Æ´Ñ $Filename ¿¡¼­ ÀÐ¾î µéÀÔ´Ï´Ù.
  echo $name
  if [ "$name" = Smith ]   # ÀÌ·± ÀÛ¾÷À» Ãß°¡ÀûÀ¸·Î µ¡ºÙ¿©¾ß ÇÕ´Ï´Ù.
  then
    break
  fi  
done <$Filename   # Ç¥ÁØÀÔ·ÂÀ» $Filename À¸·Î ÀçÁöÇâ

exit 0

예 3-76. ÀçÁöÇâµÈ if/then Å×½ºÆ®¹®

#!/bin/bash

if [ -z $1 ]
then
  Filename=names.data  # ÆÄÀÏ À̸§ÀÌ ÁÖ¾îÁöÁö ¾ÊÀ» °æ¿ì¿¡ ¾µ ±âº»°ª
else
  Filename="$1"
fi  

TRUE=1

if [ $TRUE ]
then
 read name
 echo $name
fi <$Filename
# ÆÄÀÏÀÇ Ã¹¹øÂ° ÁÙ¸¸ ÀÐ¾î µéÀÔ´Ï´Ù.
# if/then Å×½ºÆ® ¹®Àº ·çÇÁ¾È¿¡¼­ ¾²ÀÌÁö ¾Ê´Â ÇÑ, ¹Ýº¹Çؼ­ ºñ±³ÇÒ ¹æ¹ýÀÌ ¾ø½À´Ï´Ù.

exit 0

참고: Here documents´Â I/O ÀçÁöÇâÀÇ Æ¯º°ÇÑ ÄÉÀ̽ºÀÔ´Ï´Ù. 3.24절¸¦ Âü°íÇϼ¼¿ä.

주석

[1]

ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â ¿î¿µÃ¼Á¦°¡ ¿­·Á ÀÖ´Â ÆÄÀÏ¿¡ ´ëÇØ ÃßÀûÇÒ ¼ö ÀÖ°Ô ÇÒ´çÇØ ÁÖ´Â °£´ÜÇÑ ¼ýÀÚÀÔ´Ï´Ù. ÆÄÀÏ Æ÷ÀÎÅ͸¦ °£·«È­ÇÑ ¹öÀüÀ̶ó°í »ý°¢ÇÏ¸é µË´Ï´Ù. C ¿¡¼­ ÆÄÀÏ ÇÚµé¿Í À¯»çÇÑ °³³äÀÔ´Ï´Ù.

[2]

5¹ø ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ¾²¸é ¹®Á¦°¡ »ý±æ ¼ö ÀÖ½À´Ï´Ù. Bash°¡ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ exec·Î Æ÷Å©(fork)ÇÒ ¶§, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ 5¹ø ÆÄÀÏ µð½ºÅ©¸³Å͸¦ »ó¼Ó ¹Þ½À´Ï´Ù(Chet RameyÀÇ ¿¹Àü À̸ÞÀÏ( SUBJECT: RE: File descriptor 5 is held open)À» Âü°íÇϼ¼¿ä). ÀÌ 5¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â °Çµå¸®Áö ¾Ê´Â°Ô ÁÁ½À´Ï´Ù.