16Àå. I/O ÀçÁöÇâ

Â÷·Ê
16.1. exec ¾²±â
16.2. ÄÚµå ºí·° ÀçÁöÇâ
16.3. ÀÀ¿ë

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

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

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

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

   : > filename
      # > ´Â "filename"ÀÇ ±æÀ̰¡ 0 ÀÌ µÇµµ·Ï Àß¶óÁÝ´Ï´Ù.
      # : ´Â ¾Æ¹« Ãâ·Âµµ ¾È ÇÏ´Â ´õ¹Ì Ç÷¹À̽ºÈ¦´õ(placeholder)·Î µ¿ÀÛÇÕ´Ï´Ù.

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

   2>&1
      # Ç¥ÁØ¿¡·¯¸¦ Ç¥ÁØÃâ·ÂÀ¸·Î ÀçÁöÇâ.
      # ¿¡·¯ ¸Þ¼¼Áö´Â Ç¥ÁØ Ãâ·ÂÀÇ ÀÚ°ÝÀ¸·Î ½ºÅ©¸°¿¡ º¸³»Áý´Ï´Ù.

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

   >&j
      # ±âº»ÀûÀ¸·Î 1¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ(Ç¥ÁØÃâ·Â)¸¦ j¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ·Î ÀçÁöÇâ.
      # ¸ðµç Ç¥ÁØÃâ·ÂÀº j°¡ °¡¸£Å°´Â ÆÄÀÏ·Î º¸³»Áý´Ï´Ù.

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


   [j]<>filename
      # "filename"À» ÀÐ°í ¾²±â¿ëÀ¸·Î ¿­°í "j"¹ø ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ÇÒ´çÇÕ´Ï´Ù.
      # "filename"ÀÌ ¾ø´Ù¸é »õ·Î ¸¸µì´Ï´Ù.
      # "filename"ÀÌ ÁÖ¾îÁöÁö ¾ÊÀ¸¸é ±âº»ÀûÀ¸·Î Ç¥ÁØÀÔ·ÂÀÎ 0¹øÀÌ ÇÒ´çµË´Ï´Ù.
      #
      # À̸¦ ÀÀ¿ëÇÏ¸é ÆÄÀÏÀÇ Æ¯Á¤ÇÑ À§Ä¡¿¡ ¾²±â¸¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
      echo 1234567890 > File    # "File"¿¡ ¹®ÀÚ¿­À» ¾¹´Ï´Ù.
      exec 3<> File       # "File"À» ¿­°í 3¹ø ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ÇÒ´çÇÕ´Ï´Ù.
      read -n 4 <&3             # ¹®ÀÚ 4°³¸¸ ÀÐÀº ´ÙÀ½,
      echo -n . >&3             # ¼Ò¼öÁ¡À» ¾²°í,
      exec 3>&-                 # 3¹ø ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ´Ý½À´Ï´Ù.
      cat File                  # ==> 1234.67890
      # ¾î¶ó, ·£´ý ¾ï¼¼½º³×.



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

¿©·¯°³ÀÇ ÀÔÃâ·Â ÀçÁöÇâ°ú ÆÄÀÌÇÁ¸¦ ÇϳªÀÇ ¸í·É¾î ÁÙ¿¡¼­ °°ÀÌ ¾µ ¼ö ÀÖ½À´Ï´Ù.
command < input-file > output-file
command1 | command2 | command3 > output-file
¿¹ 12-23 ¿Í ¿¹ A-10 ¸¦ Âü°í.

¿©·¯°³ÀÇ Ãâ·Â ½ºÆ®¸²ÀÌ ÇÑ ÆÄÀÏ·Î ÀçÁöÇâ µÉ ¼öµµ ÀÖ½À´Ï´Ù.
ls -yz >> command.log 2>&1
# "ls"ÀÇ À߸øµÈ ¿É¼ÇÀÎ "yz"ÀÇ °á°ú¸¦ "command.log"·Î ÀúÀåÇÕ´Ï´Ù.
# Ç¥ÁØ¿¡·¯°¡ ÆÄÀÏ·Î ÀçÁöÇ⠵Ʊ⠶§¹®¿¡ ¾î¶² ¿¡·¯ ¸Þ¼¼Áö¶óµµ ±× ÆÄÀÏ¿¡ ÀúÀåµË´Ï´Ù.

ÆÄÀÏ µð½ºÅ©¸³ÅÍ ´Ý±â

n<&-

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

0<&-, <&-

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

n>&-

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

1>&-, >&-

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

ÀÚ½Ä ÇÁ·Î¼¼½º´Â ¿­·Á ÀÖ´Â ÆÄÀÏ µð½ºÅ©¸³Å͸¦ »ó¼Ó ¹Þ´Âµ¥ ÀÌ°Í ¶§¹®¿¡ ÆÄÀÌÇÁ°¡ µ¿ÀÛÇÕ´Ï´Ù. ÆÄÀÏ µð½ºÅ©¸³ÅͰ¡ »ó¼ÓµÇ±æ ¹Ù¶óÁö ¾Ê´Â´Ù¸é ±× ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ´ÝÀ¸¸é µË´Ï´Ù.
# ÆÄÀÌÇÁ·Î Ç¥ÁØ¿¡·¯¸¸ ÀçÁöÇâ Çϱâ.

exec 3>&1                              # Ç¥ÁØÃâ·ÂÀÇ ÇöÀç "°ª"À» ÀúÀå.
ls -l 2>&1 >&3 3>&- | grep bad 3>&-    # 'ls'¿Í 'grep'À» À§ÇØ 3¹ø ÆÄÀÏ µð½ºÅ©¸³Å͸¦ ´Ý°í,
exec 3>&-                              # ÀÌÁ¦, ½ºÅ©¸³Æ® ³ª¸ÓÁö ºÎºÐÀ» À§ÇØ ´Ý½À´Ï´Ù.

# Thanks, S.C.

I/O ÀçÁöÇâ¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ ¼Ò°³´Â ºÎ·Ï D¸¦ Âü°íÇϼ¼¿ä.

ÁÖ¼®

[1]

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

[2]

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