20Àå. ¼­ºê½©(Subshells)

¿©·¯ºÐÀÌ ½© ½ºÅ©¸³Æ®¸¦ ½ÇÇà½ÃÅ°°Ô µÇ¸é ´Ù¸¥ ¸í·É¾î ÇÁ·Î¼¼½ºÀÇ ÀνºÅϽº¸¦ ¶ç¿ó´Ï´Ù. ¿©·¯ºÐÀÌ ½ÇÇà½ÃŲ ¸í·É¾î°¡ ¸í·É¾î ÁÙ ÇÁ·ÒÇÁÆ®¿¡¼­ Çؼ®µÉ ¶§, ½ºÅ©¸³Æ® ÆÄÀÏ¿¡ µé¾î ÀÖ´Â ¸í·É¾î ¸ñ·Ïµµ ÇÑ ¹ø¿¡ °°ÀÌ Ã³¸®ÇÏ°Ô µË´Ï´Ù. ÀÌ ¶§ ½ÇÇàµÇ´Â °¢°¢ÀÇ ½© ½ºÅ©¸³Æ®´Â »ç½Ç, ÄܼÖÀ̳ª ÇÑÅÒ¿¡¼­ ¿©·¯ºÐ¿¡°Ô ÇÁ·ÒÇÁÆ®¸¦ º¸¿©ÁÖ´ø ºÎ¸ð ½©ÀÇ ¼­ºê ÇÁ·Î¼¼½ºÀÔ´Ï´Ù.

½© ½ºÅ©¸³Æ® Àڽŵµ ¼­ºê ÇÁ·Î¼¼½º¸¦ ¶ç¿ï ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¼­ºê½© ´öºÐ¿¡ ½ºÅ©¸³Æ®°¡ º´·Ä·Î ó¸®µÇ°í °á±¹ µ¿½Ã¿¡ ´ÙÁß ÀÛ¾÷À» ÇÏ´Â °Í°ú µ¿ÀÏÇÑ °á°ú¸¦ °¡Á®¿É´Ï´Ù.

º´·ÄÀûÀÎ ¸í·É¾î ¸ñ·Ï

( command1; command2; command3; ... )

Áß°ýÈ£ ¼Ó¿¡ µé¾î ÀÖ´Â ¸í·É¾îµéÀº ¼­ºê½©·Î µ¹°Ô µË´Ï´Ù.

Âü°í: ¼­ºê½©ÀÇ º¯¼öµéÀº ¼­ºê½©ÀÌ ¼ÓÇØ ÀÖ´Â ÄÚµå ºí·° ¹ÛÀ¸·Î º¸ÀÌÁö ¾Ê½À´Ï´Ù. ÀÌ º¯¼öµéÀº ºÎ¸ð ÇÁ·Î¼¼½º³ª ±× ¼­ºê½©À» ¶ç¿î ½©¿¡¼­ Á¢±ÙÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ½ÇÁ¦·Î´Â Áö¿ª º¯¼ö°¡ µË´Ï´Ù.

¿¹ 20-1. ¼­ºê½©¿¡¼­ º¯¼öÀÇ Åë¿ë ¹üÀ§(variable scope)

#!/bin/bash
# subshell.sh

echo

outer_variable=Outer

(
inner_variable=Inner
echo "¼­ºê½©ÀÇ \"inner_variable\" = $inner_variable"
echo "¼­ºê½©ÀÇ \"outer\" = $outer_variable"
)

echo

if [ -z "$inner_variable" ]
then
  echo "inner_variable Àº ½©ÀÇ ¸ÞÀο¡¼­ Á¤ÀǵÇÁö ¾Ê¾Ò½À´Ï´Ù."
else
  echo "inner_variable Àº ½©ÀÇ ¸ÞÀο¡¼­ Á¤ÀǵǾú½À´Ï´Ù."
fi

echo "½© ¸ÞÀÎÀÇ \"inner_variable\" = $inner_variable"
# $inner_variable Àº ÃʱâÈ­µÇÁö ¾ÊÀº °Íó·³ º¸À̴µ¥,
# ¼­ºê½©¿¡¼­ Á¤ÀÇµÈ º¯¼ö´Â ±× ¼­ºê½©ÀÇ "Áö¿ª º¯¼ö"À̱⠶§¹®ÀÔ´Ï´Ù.

echo

exit 0

¿¹ 32-1 Âü°í.

+

¼­ºê½©¿¡¼­ ÀÛ¾÷ µð·ºÅ丮°¡ º¯°æµÅµµ, ºÎ¸ð ½©¿¡°Ô ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê½À´Ï´Ù.

¿¹ 20-2. »ç¿ëÀÚ ÇÁ·ÎÆÄÀÏ º¸±â

#!/bin/bash
# allprofs.sh: ¸ðµç »ç¿ëÀÚÀÇ ÇÁ·ÎÆÄÀÏ Ãâ·Â

# ÀÌ ½ºÅ©¸³Æ®´Â Heiner Steven ÀÌ ÀÛ¼ºÇÏ°í, ÀÌ ¹®¼­ÀÇ ÀúÀÚ°¡ ¼öÁ¤Çß½À´Ï´Ù.

FILE=.bashrc  #  »ç¿ëÀÚ ÇÁ·ÎÆÄÀÏÀ» ´ã°í ÀÖ´Â ÆÄÀÏ.
              #+ ¿ø·¡ ½ºÅ©¸³Æ®¿¡¼­´Â ".profile" À̾ú½À´Ï´Ù.

for home in `awk -F: '{print $6}' /etc/passwd`
do
  [ -d "$home" ] || continue    # Ȩ µð·ºÅ丮°¡ ¾ø´Â »ç¿ëÀÚ¶ó¸é ´ÙÀ½À¸·Î ³Ñ¾î°¨.
  [ -r "$home" ] || continue    # ÀÐÀ»¼ö ¾ø´Â Ȩµð·ºÅ丮¶ó¸é ¿ª½Ã ±×³É ³Ñ¾î°¨.
  (cd $home; [ -e $FILE ] && less $FILE)
done

# 'cd $home' ÀÌ ¼­ºê½©¿¡¼­ µ¹±â ¶§¹®¿¡,
#+ ½ºÅ©¸³Æ®°¡ ³¡³­ ´ÙÀ½, 'cd'¸¦ ½á¼­ ¿ø·¡ µð·ºÅ丮·Î ´Ù½Ã µ¹¾Æ°¥ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù.

exit 0

¼­ºê½©Àº ƯÁ¤ ¸í·É¾î ±×·ì¿¡ ±×µé¸¸ÀÇ "Àü¿ë ȯ°æ"(dedicated environment)À» ¼³Á¤ÇØ ÁÙ ¼ö ÀÖ½À´Ï´Ù.
COMMAND1
COMMAND2
COMMAND3
(
  IFS=:
  PATH=/bin
  unset TERMINFO
  set -C
  shift 5
  COMMAND4
  COMMAND5
  exit 3 # ¼­ºê½©¸¸ Á¾·á½ÃÅ´.
)
# ºÎ¸ð ½©ÀÇ È¯°æÀº ¿µÇâÀ» ¹ÞÁö ¾Ê°í ±×´ë·Î ³²¾Æ ÀÖ½À´Ï´Ù.
COMMAND6
COMMAND7
º¯¼ö°¡ Á¤ÀǵƴÂÁö ¾Æ´ÑÁö¸¦ È®ÀÎÇØ º¸´Âµ¥ ÀÌ°É ÀÀ¿ëÇØ º¼ ¼ö ÀÖ½À´Ï´Ù.
if (set -u; : $variable) 2> /dev/null
then
  echo "º¯¼ö°¡ ¼¼Æ®µÇ¾î ÀÖ½À´Ï´Ù."
fi

# ÀÌ·¸°Ôµµ ÇÒ ¼ö ÀÖÁÒ.  [[ ${variable-x} != x || ${variable-y} != y ]]
# ȤÀº                  [[ ${variable-x} != x$variable ]]
# ¿ª½Ã                  [[ ${variable+x} = x ]])
Àá±Ý ÆÄÀÏÀ» È®ÀÎÇϴµ¥µµ ÀÀ¿ëÇØ º¼ ¼ö ÀÖ½À´Ï´Ù:
if (set -C; : > lock_file) 2> /dev/null
then
  echo "´Ù¸¥ »ç¿ëÀÚ°¡ ÀÌ¹Ì ½ÇÇàÁßÀÔ´Ï´Ù."
  exit 65
fi

# Thanks, S.C.

ÇÁ·Î¼¼½º¸¦ ´Ù¸¥ ¼­ºê½©¿¡¼­ º´·Ä·Î ½ÇÇà½Ãų ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é º¹ÀâÇÑ ÀÛ¾÷À» ¿©·¯°³·Î ³ª´©¾î¼­ µ¿½Ã¿¡ ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿¹ 20-3. ÇÁ·Î¼¼½º¸¦ ¼­ºê½©¿¡¼­ º´·Ä·Î µ¹¸®±â

    (cat list1 list2 list3 | sort | uniq > list123) &
    (cat list4 list5 list6 | sort | uniq > list456) &
    # µ¿½Ã¿¡ µÎ Á¾·ùÀÇ ÆÄÀϵéÀ» ÇÕÄ¡°í Á¤·Ä.
    # ¹é±×¶ó¿îµå·Î µ¹·Á¼­ º´·Ä·Î È®½ÇÈ÷ ¼öÇàµÇµµ·Ï ÇÔ.
    #
    # ´ÙÀ½°ú °°Àº °á°ú.
    #   cat list1 list2 list3 | sort | uniq > list123 &
    #   cat list4 list5 list6 | sort | uniq > list456 &

    wait   # ¼­ºê½©ÀÌ ³¡³ª±â Àü¿¡ ´ÙÀ½ ¸í·É¾î¸¦ ½ÇÇàÇÏÁö ¾Ê°Ô ÇÔ.

    diff list123 list456

¼­ºê½©·Î I/O ÀçÁöÇâÀ» ÇÏ·Á¸é ls -al | (command) ó·³ ÆÄÀÌÇÁ ¿¬»êÀÚÀÎ "|"¸¦ ¾¹´Ï´Ù.

Âü°í: Áß°ýÈ£¼ÓÀÇ ¸í·É¾î ºí·°Àº ¼­ºê½©À» ¶ç¿ìÁö ¾Ê½À´Ï´Ù.

{ command1; command2; command3; ... }