Devel Filter Skeleton
Developing Filter Programs ¶UNIXÀÇ ´ëºÎºÐ À¯Æ¿¸®Æ¼µéÀº filter(ÇÊÅÍ) Çü½ÄÀ¸·Î µÇ¾î ÀÖ½À´Ï´Ù. Áï, Ç¥ÁØ ÀÔ·Â(stdin)À¸·Î µ¥ÀÌÅ͸¦ ¹Þ¾Æ¼ °¡°øÇÑ ´ÙÀ½, ÀÌ °¡°øµÈ µ¥ÀÌÅ͸¦ Ç¥ÁØ Ãâ·Â(stdout)À¸·Î Ãâ·ÂÇÕ´Ï´Ù. ¶ÇÇÑ Ã³¸® µµÁß ¹ß»ýÇÑ ¿¡·¯´Â Ç¥ÁØ ¿¡·¯ Ãâ·Â(stderr)À¸·Î Ãâ·ÂÇÕ´Ï´Ù. ¶ÇÇÑ ´ëºÎºÐÀÇ À¯Æ¿¸®Æ¼µéÀº ó¸® ¹æ½Ä¿¡ ¿µÇâÀ» ÁÖ´Â ¿©·¯ °¡Áö ¿É¼ÇÀ» ¹Þ¾Æ¼ ó¸®ÇÒ ¼ö ÀÖÀ¸¸ç, Ç¥ÁØ ÀÔ·Â ´ë½Å, command-line argument(¸í·É ÀÎÀÚ)·Î, Çϳª ¶Ç´Â ¿©·¯ °³ÀÇ ÆÄÀÏ À̸§À» ÀÔ·Â ¹Þ¾Æ ÀÛ¾÷Çϱ⵵ ÇÕ´Ï´Ù. ÀÌ·± À¯Æ¿¸®Æ¼¿¡´Â ´ëÇ¥ÀûÀÎ UNIX À¯Æ¿¸®Æ¼ÀÎ, cat(1), wc(1), cut(1), paste(1) µîµî ¿©·¯ °¡Áö°¡ ÁغñµÇ¾î ÀÖ½À´Ï´Ù.
¿©·¯ºÐÀÌ Æ¯º°ÇÑ ÇÊÅÍ ÇÁ·Î±×·¥À» ¸¸µé¾î¾ß ÇÒ °æ¿ì, ÀÌ·¯ÇÑ UNIX À¯Æ¿¸®Æ¼µéÀÇ ¹æ½ÄÀ» ±×´ë·Î µû¿Í¼ µ¿ÀÛ ¹æ½ÄÀ» ºñ½ÁÇÏ°Ô ¸¸µé¾î µÎ¸é, ³ªÁß¿¡ shell script¸¦ ¸¸µé ¶§¿¡µµ Æí¸®Çϸç, ¹èÆ÷½Ã¿¡µµ »ó´çÈ÷ È¿°ú¸¦ º¼ ¼ö ÀÖ½À´Ï´Ù.
1.1.1. Conventional Options ¶UNIXÀÇ ´ëºÎºÐ ÇÊÅÍ ÇÁ·Î±×·¥µéÀº ó¸®ÇÒ µ¥ÀÌÅÍ°¡ ´ã±ä ÆÄÀϵéÀ» (command-line argument·Î) ¹Þ±â Àü¿¡, '-'·Î ½ÃÀÛÇÏ´Â ¿É¼ÇµéÀ» ¹Þ½À´Ï´Ù. ¿É¼ÇµéÀº º¸Åë ÇÑ ±ÛÀÚ·Î µÇ¾î ÀÖÀ¸¸ç, ¿©·¯ °³ÀÇ ¿É¼ÇÀ» Çϳª·Î ¹Þ±âµµ ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ¾î¶² ÇÊÅÍ ÇÁ·Î±×·¥ÀÌ '-v'¿Í '-r'À̶ó´Â ¿É¼ÇÀ» ¹Þ¾Æ ó¸®ÇÒ ¼ö ÀÖ´Ù°í ÇØ º¾½Ã´Ù. ÀÌ ÇÁ·Î±×·¥ À̸§Àº ÆíÀÇ»ó foo¶ó°í ÇÏ°Ú½À´Ï´Ù. ÀÌ °æ¿ì, foo¸¦ ½ÇÇàÇÏ´Â ¹æ¹ýÀº ´ÙÀ½ ³× °¡Áö·Î º¼ ¼ö ÀÖ½À´Ï´Ù:
$ foo -v -r data.file
$ foo -r -v data.file $ foo -vr data.file $ foo -rv data.file ¿É¼Ç¿¡ µû¶ó Ãß°¡·Î argument¸¦ ¹Þ¾Æ¼ ó¸®ÇÏ´Â ¿É¼Çµµ ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì ¿É¼Ç ¹Ù·Î µÚ¿¡ ÀÌ ¿É¼ÇÀ» À§ÇÑ ÀÎÀÚ°¡ ºÙ½À´Ï´Ù. ¿¹¸¦ µé¾î foo ¸í·ÉÀº ¿ø·¡ ó¸® °á°ú¸¦ Ç¥ÁØ Ãâ·ÂÀ¸·Î Ãâ·ÂÇÏÁö¸¸ '-o filename'À» ¾µ °æ¿ì, ÁÖ¾îÁø ÆÄÀÏ, filename¿¡ ±× °á°ú¸¦ ÀúÀåÇÑ´Ù°í ÇսôÙ. ÀÌ °æ¿ì, '-v'¿Í '-r'À» ÇÔ²² ¾²±â À§ÇØ, ´ÙÀ½ Áß Çϳª¸¦ ¼±ÅÃÇÏ¸é µË´Ï´Ù.
$ foo -v -r -o out.file data.file
$ foo -v -o out.file -r data.file $ foo -rv -o out.file data.file $ foo -o out.file -vr data.file $ foo -rvo out.file data.file ¹°·Ð À§¿¡¼ ³ª¿ÇÑ ¹æ¹ý ÀÌ¿Ü¿¡µµ ¿©·¯ °¡Áö Á¶ÇÕÀÌ °¡´ÉÇÕ´Ï´Ù.
´ëºÎºÐÀÇ ÇÊÅÍ ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¶§, ó¸®ÇÒ ÆÄÀÏ À̸§À» ÁÖÁö ¾ÊÀ¸¸é, ´ë°³ Ç¥ÁØ ÀԷ¿¡¼ µ¥ÀÌÅ͸¦ ¹Þ½À´Ï´Ù. cat(1)ó·³ ÀÔ·Â µ¥ÀÌÅ͸¦ ¹Ù·Î Ãâ·ÂÇÏ´Â ÇÊÅÍÀÇ °æ¿ì ´ÙÀ½°ú °°ÀÌ µ¿ÀÛÇÕ´Ï´Ù.
$ cat data.file
hello, world greetings, folks. $ cat hello, world ^d # press control-D to acknowledge EOF. hello, world $ _ Áï, À§ °á°úÀ» º¸¸é, cat(1)ÀÇ ÀÔ·ÂÀ¸·Î data.fileÀ̶õ ÆÄÀÏÀ» ÁÖ¸é ¹Ù·Î ±× ÆÄÀÏÀÇ ³»¿ëÀ» Ãâ·ÂÇÕ´Ï´Ù. ¶Ç ¾Æ¹«·± ÆÄÀÏ À̸§¾øÀÌ ¹Ù·Î ½ÇÇàÇϸé, cat(1)Àº »ç¿ëÀÚ°¡ Ç¥ÁØ ÀԷ¿¡¼ ÀÔ·ÂÀ» ¹Þ±â À§ÇØ ´ë±âÇÕ´Ï´Ù. ÀÌ ¶§ "hello, world\n"¸¦ ÀÔ·ÂÇÏ°í control-d Å°¸¦ ´©¸£¸é EOF(end-of-file)À» Àü´ÞÇؼ, ÀÔ·ÂÀÌ ³¡³µ´Ù´Â °ÍÀ» ¾Ë·ÁÁÝ´Ï´Ù. ±×·¯¸é cat(1)ÀÌ ±× ÀÔ·ÂÀ» ¹Þ¾Æ¼ Ãâ·ÂÇÏ°Ô µË´Ï´Ù.
¶§¿¡ µû¶ó¼ ¿©·¯ °³ÀÇ ÆÄÀÏ°ú Ç¥ÁØ ÀԷ¿¡¼ µé¾î¿À´Â ÀÔ·ÂÀ» µ¿½Ã¿¡ ó¸®ÇØ¾ß ÇÏ´Â °æ¿ìµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î¼ Ãâ·ÂÇÏ°íÀÚ ÇÏ´Â ³»¿ëÀÌ 1.txt, 2.txt, 3.txt¶ó´Â ÆÄÀÏ¿¡ µé¾î ÀÖ´Â ³»¿ëÀÌ°í, ¶ÇÇÑ Ç¥ÁØ ÀԷ¿¡¼ ¹ÞÀº ³»¿ëµµ Ãâ·ÂÇϱ⸦ ¿øÇÑ´Ù°í °¡Á¤ÇØ º¾½Ã´Ù. Ãâ·ÂÇÏ´Â ¼ø¼´Â 1.txt ±×¸®°í Ç¥ÁØ ÀԷ¿¡¼ ¹ÞÀº ³»¿ë, ±×¸®°í 2.txt¿Í 3.txt ¼ø¼·Î Ãâ·ÂÇÏ·Á ÇÕ´Ï´Ù. ±×·¯¸é ¾î¶»°Ô cat(1)À» ½ÇÇàÇØ¾ß ÇÒ±î¿ä? ºÐ¸í 1.txt, 2.txt, 3.txt¸¦ ¼ø¼´ë·Î Ãâ·ÂÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°ÀÌ ÇØ¾ß ÇÕ´Ï´Ù:
$ cat 1.txt 2.txt 3.txt
±×·¯³ª ¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº 1.txt¿Í 2.txt »çÀÌ¿¡ Ç¥ÁØ ÀԷ¿¡¼ µ¥ÀÌÅÍ°¡ µé¾î¿À´Â °ÍÀ̱⠶§¹®¿¡ À§¿Í °°ÀÌ ÇÒ ¼ö ¾ø½À´Ï´Ù. °Ô´Ù°¡ cat(1)À» ºñ·ÔÇÑ ´ëºÎºÐÀÇ ÇÊÅÍ ÇÁ·Î±×·¥Àº, ÆÄÀÏ À̸§À» Çϳª ÀÌ»ó ÁÖ¾úÀ» °æ¿ì, Ç¥ÁØ ÀԷ¿¡¼ µ¥ÀÌÅ͸¦ ¹ÞÁö ¾Ê½À´Ï´Ù.
ÇØ°áÃ¥Àº ÀÇ¿Ü·Î °£´ÜÇÕ´Ï´Ù. ÆÄÀÏ À̸§ÀÌ ¿Ã ÀÚ¸®¿¡ "-"¸¦ ÁÖ°Ô µÇ¸é, cat(1)À» ºñ·Ô, ´ëºÎºÐÀÇ ÇÊÅÍ ÇÁ·Î±×·¥ÀÌ Ç¥ÁØ ÀԷ¿¡¼ ÀÔ·ÂÀ» ¹Þ½À´Ï´Ù. µû¶ó¼ ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÏ¸é ¹®Á¦°¡ ÇØ°áµË´Ï´Ù:
$ cat 1.txt - 2.txt 3.txt
'-' ¹®ÀÚ°¡ (À§¿Í °°ÀÌ) ´Üµ¶À¸·Î ¾²ÀÏ °æ¿ì, ´ëºÎºÐÀÇ ÇÊÅÍ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ ÀνÄÇÕ´Ï´Ù.
ù°. ÀÔ·Â µ¥ÀÌÅÍ ÆÄÀÏ À̸§ÀÌ ¿Ã ÀÚ¸®¿¡ '-'¸¦ ¾´ °æ¿ì, Ç¥ÁØ ÀԷ¿¡¼ µ¥ÀÌÅ͸¦ ¹Þ°Ô µË´Ï´Ù.
µÑ°, Ãâ·Â µ¥ÀÌÅÍ ÆÄÀÏ À̸§ÀÌ ¿Ã ÀÚ¸®¿¡ '-'¸¦ ¾´ °æ¿ì, Ç¥ÁØ Ãâ·ÂÀ¸·Î µ¥ÀÌÅ͸¦ Ãâ·ÂÇÕ´Ï´Ù.
ÇÑ°¡Áö ´õ, ¸ðµç ÇÊÅÍ ÇÁ·Î±×·¥ÀÌ '-'¸¦ ÀÌ·¯ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÏ´Â °ÍÀº ¾Æ´Õ´Ï´Ù. ƯÁ¤ ÇÁ·Î±×·¥ÀÌ '-'¸¦ Ưº°ÇÑ ÆÄÀÏ À̸§À¸·Î Ãë±ÞÇÏ´ÂÁö ¸ÕÀú Å×½ºÆ®ÇØ º¸°í »ç¿ëÇϱ⠹ٶø´Ï´Ù.
ƯÁ¤ ¿É¼Ç ±ÛÀÚ°¡ ¾î¶² ¶æÀ» °¡Áö°í ÀÖ´ÂÁö ¿Ü¿ö µÎ±â¶õ ½¬¿î ÀÏÀÌ ¾Æ´ÏÁö¸¸, ¾Æ·¡ Ç¥¸¦ º¸¸é ´ëºÎºÐ ¸í·ÉµéÀÌ °¢ ¿É¼ÇÀ» ¾î¶°ÇÑ ¶æÀ¸·Î ¾²´Â Áö ¾Ë ¼ö ÀÖ½À´Ï´Ù:
¹°·Ð, ÇÁ·Î±×·¥¿¡ µû¶ó À§¿¡ ¾²ÀÎ ¿É¼Ç ÀÌ¿ÜÀÇ ´Ù¸¥ ¿É¼ÇÀ» ¾²´Â °æ¿ìµµ ÀÖ°í, À§ÀÇ Çؼ®°ú´Â ÀüÇô ´Ù¸¥ ¶æÀ» °¡Áø °ÍÀ¸·Î Çؼ®Çϱ⵵ ÇÕ´Ï´Ù. ÀÌ´Â ¼øÀüÈ÷, ÇÊÅÍ ÇÁ·Î±×·¥À» ¸¸µå´Â °³¹ßÀÚ ¸¶À½´ë·ÎÁö¸¸, ¿©·¯ºÐÀÌ »õ ÇÊÅÍ ÇÁ·Î±×·¥À» ¸¸µç´Ù¸é, À§ÀÇ Ç¥¸¦ Âü°íÇؼ °³¹ßÇϸé, ´Ù¸¥ »ç¿ëÀÚµéÀÌ ½±°Ô ÀûÀÀÇÒ ¼ö ÀÖ½À´Ï´Ù. 1.1.2. Long Options ¶´ëºÎºÐ ¿É¼ÇÀÌ ÇÑ ±ÛÀÚ·Î ÀÌ·ç¾îÁ® Àֱ⠶§¹®¿¡, ÀÚÁÖ ¾²´Â ÇÊÅÍ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ñ ÀÌ»ó, °¢ ¿É¼ÇÀÌ ¾î¶² ±â´ÉÀ» ÇÏ´ÂÁö ¿Ü¿öµÎ±â¶õ ½¬¿î ÀÏÀÌ ¾Æ´Õ´Ï´Ù. µû¶ó¼ GNU¿¡¼ Á¦°øÇÏ´Â ´ëºÎºÐÀÇ ÇÊÅÍ ÇÁ·Î±×·¥Àº '-'·Î ½ÃÀÛÇÏ´Â ÇÑ ±ÛÀÚ ¿É¼Ç ÀÌ¿Ü¿¡µµ '--'·Î ½ÃÀÛÇÏ°í ¿©·¯ ±ÛÀÚ·Î ÀÌ·ç¾îÁø ¿É¼Çµéµµ Á¦°øÇÕ´Ï´Ù. º¸Åë '--'·Î ½ÃÀÛÇÏ´Â ¿É¼ÇµéÀ» long optionÀ̶ó°í ÇÕ´Ï´Ù.
¿¹¸¦ µé¾î, µµ¿ò¸»À» Ãâ·ÂÇϱâ À§ÇØ º¸Åë '-h'³ª '-?'¸¦ ¾²Áö¸¸, '
¶ÇÇÑ ÇÑ ±ÛÀÚ ¿É¼Ç°ú ±ä ¿É¼ÇÀÌ ´Ù¸¥ Á¡ Áß Çϳª´Â, ¿É¼ÇÀÌ ÀÎÀÚ¸¦ ¹ÞÀ» ¶§ÀÔ´Ï´Ù. ÇÑ ±ÛÀÚ ¿É¼ÇÀÎ °æ¿ì, '-o filename'°ú °°ÀÌ ¿É¼Ç ±ÛÀÚ µÚ¿¡ °ø¹éÀ» µÎ°í ÆÄÀÏ À̸§À» ¹ÞÁö¸¸, ±ä ¿É¼ÇÀÎ °æ¿ì, ¿É¼Ç µÚ¿¡ '='¸¦ ºÙÀÌ°í °ø¹é ¾øÀÌ ÀÔ·ÂÇÕ´Ï´Ù. Áï, '--output=filename'°ú °°ÀÌ ¾¹´Ï´Ù. 1.2. Messages ¶ÇÁ·Î±×·¥ÀÌ ÀÛ¾÷À» ó¸®ÇÏ´Â µµÁß, °æ°í³ª ¶æÇÏÁö ¾ÊÀº »óȲÀ» ¸¸³ª°Ô µÇ°Å³ª, ±âŸ »ç¿ëÀÚ¿¡°Ô ¾Ë¸± ³»¿ëÀÌ ÀÖÀ» °æ¿ì, ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°Ô µË´Ï´Ù. º¸Åë ÀÛ¾÷ °á°ú¿Í °ãÄ¡Áö ¾Ê°Ô Çϱâ À§ÇØ, ÀÌ·¯ÇÑ ¸Þ½ÃÁöµéÀº Ç¥ÁØ Ãâ·ÂÀ¸·Î ³ª°¡Áö ¾Ê°í, Ç¥ÁØ ¿¡·¯ Ãâ·ÂÀ¸·Î ³ª°¡°Ô µË´Ï´Ù.
¶ÇÇÑ ÀÔ·Â ÆÄÀÏÀ» ó¸®ÇÏ´Â µµÁß, ¿øÄ¡ ¾Ê´Â ÀÔ·ÂÀ» ¸¸³ª°Ô µÉ °æ¿ì, ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°Ô µÇ´Âµ¥, ÀÌ °æ¿ì, ¿¡·¯ ¸Þ½ÃÁö°¡ ´ÙÀ½°ú °°Àº Çü½ÄÀ» ¶ç°Ô ÇØ¾ß ÇÕ´Ï´Ù. ¾Æ·¡¿¡¼ (*)·Î Ç¥½ÃÇÑ °ÍÀÌ ÀÚÁÖ ¾²´Â Çü½ÄÀÔ´Ï´Ù:
1.3. Exit Status ¶ÇÁ·Î±×·¥ÀÌ Á¤»ó Á¾·áÇßÀ» °æ¿ì, exit status¸¦ 0À¸·Î ÇÏ°í, ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì, 1-255 »çÀÌÀÇ ¼ýÀÚ¸¦ ¾²µµ·Ï ÇÕ´Ï´Ù. º¸Åë, ¼º°øÇßÀ» °æ¿ì 0À», ½ÇÆÐÇßÀ» °æ¿ì 1À» ¾²´Â °ÍÀ¸·Î ÃæºÐÇÕ´Ï´Ù.
1.4. Helper Files ¶ÇÁ·Î±×·¥À» ½ÃÀÛÇÒ ¶§, º¸Åë ¼ö ¸¹Àº ¿É¼ÇÀÌ ÇÊ¿äÇϰųª, ¸¹Àº ¾çÀÇ ¼³Á¤ÀÌ ÇÊ¿äÇÒ °æ¿ì, ¿É¼Ç ÇüÅ·ΠÁ¦°øÇÏ´Â °ÍÀº »ç¿ëÀÚ¿¡°Ô ¸¹Àº ºÒÆíÀ» ÁÝ´Ï´Ù. ÀÌ °æ¿ì, ¹Ì¸® ¼³Á¤ ÆÄÀÏÀ» ¸¸µé¾î µÎ°í, »ç¿ëÀÚ°¡ ÇÊ¿äÇÑ ¼³Á¤À» °íÄ¡°Ô ÇÑ ´ÙÀ½, ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ ¶§, ÀÌ ¼³Á¤ ÆÄÀÏÀ» ÀÐ¾î¼ µ¿ÀÛÇÏ°Ô Çϸé ÁÁ½À´Ï´Ù. (¸¸¾à ¼³Á¤ ÆÄÀÏÀ» ÀÐÀ» ¶§ ¿¡·¯°¡ ¹ß»ýÇÒ °æ¿ì ¾Õ¿¡¼ ¼³¸íÇÑ ¹æ½ÄÀ¸·Î ¿¡·¯¸¦ Ãâ·ÂÇÏ°Ô ÇÏ¸é ´õ¿í ÁÁ½À´Ï´Ù.)
¼³Á¤ ÆÄÀÏÀº º¸Åë Àüü »ç¿ëÀڵ鿡°Ô ¿µÇâÀ» ÁÖ´Â ¼³Á¤ ÆÄÀÏ°ú, ÇöÀç »ç¿ëÀÚ¿¡°Ô¸¸ ¿µÇâÀ» ÁÖ´Â ¼³Á¤ ÆÄÀÏ·Î ³ª´ ¼ö ÀÖ½À´Ï´Ù. ÀüÀÚ¸¦ system-wide init fileÀ̶ó°í ÇÏ°í, ÈÄÀÚ¸¦ user init fileÀ̶ó°í ºÎ¸£°Ú½À´Ï´Ù.
system-wide init fileÀÇ °æ¿ì, º¸Åë /etc ¾Æ·¡¿¡ À§Ä¡ÇÕ´Ï´Ù. ¸¸¾à ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ foo¶ó°í ÇÒ °æ¿ì, system-wide init fileÀº º¸Åë ´ÙÀ½°ú °°ÀÌ ¸¸µì´Ï´Ù. (*) Ç¥½Ã°¡ ÀÖ´Â °ÍÀÌ ÀÚÁÖ ¾²ÀÔ´Ï´Ù.
|
Creditors have much better memories than debtors. |