|
µð¹ö±ë
ÀÌÀü ±â»ç¸¦
ÅëÇØ ¿ì¸®´Â °£´ÜÇÑ Á¤µµÀÇ ½© ½ºÅ©¸³Æ®´Â ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ÀÌÁ¦´Â ´ÙÀ½
´Ü°è·Î ÀÛ¼ºÇÑ ½© ½ºÅ©¸³Æ®¸¦ µð¹ö±ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ´Ù·çµµ·Ï ÇϰڴÙ. ÇÁ·Î±×·¥À»
ÇÑ ¹ø¿¡ ¿¡·¯¾øÀÌ ÀÛ¼ºÇÒ ¼ö Àִ õÀç ÇÁ·Î±×·¡¸Ó°¡ ¾Æ´Ñ ÀÌ»ó µð¹ö±ëÀ̶õ ÄÚµåÀÇ
¾ÈÁ¤¼º°ú ¿Ïº®ÇÔÀ» ³ôÀÌ´Â ÇʼöÀûÀÎ ÀÛ¾÷ÀÌ´Ù. ¶ÇÇÑ ´ëºÎºÐÀÇ °æ¿ì, Äڵ带 ÀÛ¼ºÇÏ´Â
°Íº¸´Ùµµ ´õ ¸¹Àº ½Ã°£ÀÌ °É¸®´Â ÀÏÀÌ µð¹ö±ëÀÌ´Ù. º¸Åë ¸®´ª½º °³¹ß ȯ°æ¿¡¼ C·Î
ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ¿´´Ù¸é µð¹ö±ë µµ±¸·Î gdb¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ gdbÀÌÀü¿¡
°¡Àå ÁÁÀº µð¹ö±ë ¹æ¹ýÀº ÄÚµå °÷°÷¿¡ printf¸¦ Ãß°¡ÇÏ¿© ½ÇÇà °á°ú¸¦ º¸°í
¹®Á¦Á¡À» ÆÄ¾ÇÇÏ´Â °ÍÀÏ °ÍÀÌ´Ù. ½© ½ºÅ©¸³Æ®¿¡µµ º°´Ù¸¥ µð¹ö°Å°¡ Á¸ÀçÇÏÁö ¾Ê±â
¶§¹®¿¡ echo¸¦ »ç¿ëÇÏ¿© µð¹ö±ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ÇÏÁö¸¸ ´ÙÀ½¿¡¼´Â ±× ¹æ¹ý
À̿ܿ¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
½© ¿É¼Ç
±â´É
½© ÀÚüÀûÀ¸·Î
µð¹ö±ëÀ» À§ÇØ »ç¿ëµÇ´Â ¸í·ÉÇà ¿É¼ÇÀÌ ÀÖ´Ù. -v´Â ½©ÀÌ ½ºÅ©¸³Æ®¸¦ ¼öÇàÇϱâ À§Çؼ
ÀÐÀº ºÎºÐÀ» ȸ鿡 Ãâ·ÂÇØÁØ´Ù. -x´Â ÀоîµéÀÎ ºÎºÐ Áß¿¡¼ ½ÇÁ¦ ½ÇÇàÀ» ÇÑ ºÎºÐÀ»
º¸¿©ÁØ´Ù. ÀÌ °á°ú´Â stderr·Î Ãâ·ÂÀÌ µÇ¸é ´ÙÀ½ÀÇ ¼¼ °¡Áö ¹æ¹ý Áß Çϳª·Î
»ç¿ëÇÒ ¼ö ÀÖ´Ù.
¡¤½© ½ºÅ©¸³Æ®ÀÇ
ù ÁÙ¿¡ ´ÙÀ½°ú °°ÀÌ ¿É¼ÇÀ» ÁöÁ¤ÇÑ´Ù.
#!/bin/sh -xv
¡¤¼Ò½º¸¦
¼öÁ¤ÇÏÁö ¾Ê°í ÇÑ ¹ø¸¸ ½ÇÇàÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÑ´Ù.
$ sh -xv [½ºÅ©¸³Æ®À̸§]
¡¤½ºÅ©¸³Æ®ÀÇ
Àüü°¡ ¾Æ´Ñ ÀϺκп¡¼¸¸ ÀÌ ±â´ÉÀ» »ç¿ëÇÏ·Á¸é »ç¿ëÇÏ·Á°í ÇÏ´Â ºÎºÐ ¾Õ¿¡
´ÙÀ½À» Ãß°¡ÇÑ´Ù.
set -xv
¡¤ÀÌ ±â´ÉÀ»
¾ø¾Ö±â À§Çؼ ÇÊ¿äÇÑ ºÎºÐ ÀÌÈÄ¿¡ ´ÙÀ½À» Ãß°¡ÇÑ´Ù.
set +xv
ù ¹ø ±â»ç¿¡¼
´Ù·ç¾ú´ø ¿¹Á¦¸¦ ´Ù½Ã º¸¸é¼ »ç¿ë¹ýÀ» ¼³¸íÇϵµ·Ï ÇϰڴÙ.
º¸¸é ½±°Ô
¾Ë ¼ö ÀÖµíÀÌ prarg ½ºÅ©¸³Æ®´Â ¼¼ ÀÎÀÚ¸¦ ÀԷ¹޾Ƽ Ãâ·ÂÇÏ´Â ¸Å¿ì
°£´ÜÇÑ ½ºÅ©¸³Æ®ÀÌ´Ù. µÎ¹øÂ° ¹æ¹ýÀ» ÀÌ¿ëÇÏ¿©¼ ½ÇÇàÇØ º¸ÀÚ.
$ cat ./prarg
#!/bin/sh
#
# prarg: ÀÎÀÚ¸¦ Ãâ·ÂÇÏ´Ù.
#
prog=`basename
$0`
if [ $#
-eq 3 ]
then
echo ¡°Script $prog path: $0¡±
echo ¡°Arg1: $1¡±
echo ¡°Arg2: $2¡±
shift
echo ¡°Arg3: $2¡±
else
echo ¡°Usage: $ $prog arg1 arg2 arg3¡±
exit 1
fi
$ ./prarg 1 2 3
Script prarg path: ./prarg
Arg1: 1
Arg2: 2
Arg3: 3
$ sh -x ./prarg 1 2 3
++ basename ./prarg
+ prog=prarg
+ [ 3 -eq 3 ]
+ echo Script prarg path: ./prarg
Script prarg path: ./prarg
+ echo Arg1: 1
Arg1: 1
+ echo Arg2: 2
Arg2: 2
+ shift
+ echo Arg3: 3
Arg3: 3
$ sh -xv ./prarg 1 2 3
#!/bin/sh
#
# prarg: ÀÎÀÚ¸¦ Ãâ·ÂÇÏ´Ù.
#
prog=`basename
$0`
basename $0
++ basename ./prarg
+ prog=prarg
if [ $#
-eq 3 ]
then
echo ¡°Script $prog path: $0¡±
echo ¡°Arg1: $1¡±
echo ¡°Arg2: $2¡±
shift
echo ¡°Arg3: $2¡±
else
echo ¡°Usage: $ $prog arg1 arg2 arg3¡±
exit 1
fi
+ [ 3 -eq 3 ]
+ echo Script prarg path: ./prarg
Script prarg path: ./prarg
+ echo Arg1: 1
Arg1: 1
+ echo Arg2: 2
Arg2: 2
+ shift
+ echo Arg3: 3
Arg3: 3
|
-x ¿É¼Ç¸¸À¸·Î
½ÇÇàÀ» ÇÒ °æ¿ì¿¡´Â ½ºÅ©¸³Æ®¿¡¼ ½ÇÇàÇÏ´Â ºÎºÐ¸¸À» º¸¿©ÁØ´Ù. + Àº ½©ÀÌ ½ÇÇàÇÏ´Â
ºÎºÐ, ++´Â ´Ù¸¥ ¿ÜºÎ ÇÁ·Î±×·¥ÀÌ (ÀÌ ¿ÜºÎ ÇÁ·Î±×·¥Àº ½©ÀÌ ½ÇÇàÇÑ´Ù.) ½ÇÇàÇÏ´Â
ºÎºÐÀ» ÀǹÌÇÑ´Ù. -v ¿É¼Ç°ú °°ÀÌ ½ÇÇàÇÏ¸é ½ºÅ©¸³Æ®¸¦ ÀÐÀº ºÎºÐÀ» º¸¿©ÁØ´Ù.
if, for, while, case µîÀÇ ºí·°µéÀº ÇÑ ¹ø¿¡ ºí·° Àüü¸¦ Àоî¼
¼öÇàÇϱ⠶§¹®¿¡ À§ÀÇ ¿¹Á¦¿¡¼¿Í °°Àº °á°ú°¡ ³ª¿Â´Ù. Ãâ·Â½Ã¿¡´Â ½ºÅ©¸³Æ®ÀÇ ½ÇÇà
°á°ú¿Í µð¹ö±ëÀ» À§ÇÑ Ãâ·ÂÀÌ °°Àº ȸéÀ¸·Î º¸ÀÌ´Â µíÇÏÁö¸¸ ÀüÀÚ´Â stdoutÀ¸·Î,
ÈÄÀÚ´Â stderr·Î Ç¥½ÃµÇ´Â °ÍÀÌ´Ù. µû¶ó¼ ÀÌ °á°ú¸¦ ÆÄÀÏ·Î ¸®´ÙÀÌ·º¼ÇÇϱâ
À§Çؼ´Â ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇØ¾ß ÇÑ´Ù.
2>&1˼
stderr(2)ÀÇ °á°ú¸¦ stdout(1)°ú °°Àº °÷À¸·Î ¸®´ÙÀÌ·º¼ÇÇÏ´Â °ÍÀÌ´Ù.
¶ÇÇÑ ½ÇÇ๮ÀÇ
°á°ú¸¦ °Ë»çÇϱâ À§ÇÑ -e ¿É¼ÇÀÌ ÀÖ´Ù. -e´Â -x¿¡ ÀÇÇØ
Ãâ·ÂµÇ´Â ½ÇÇ๮µéÀÇ ½ÇÇà °á°ú°¡ 0ÀÌ ¾Æ´Ñ °ª Áï, ½ÇÆÐ¸¦ ¸®ÅÏÇÏ¿´À»
°æ¿ì ½© ½ºÅ©¸³Æ®¸¦ Á¾·áÇÑ´Ù. ÇÏÁö¸¸ while, until, if¹®¿¡¼ »ç¿ëÇÏ´Â
Á¶°Ç½ÄÀ̳ª &&, ||, !ÀÌ Æ÷ÇÔµÇÀÖ´Â ½ÇÇ๮¿¡¼´Â -e°¡
È¿°ú ¾ø´Ù.
»ç¿ë¹ýÀº -x, -v¸¦ »ç¿ëÇÒ ¶§¿Í °°´Ù.
$ cat ./stdio3
#!/bin/sh
#
# stdio3: Ç¥ÁØ ÀÔ·ÂÀ» ¹Þ¾Æ Ç¥ÁØ Ãâ·ÂÀ¸·Î Ç¥½ÃÇÑ´Ù.
#
filename=`line`
if [ -e
$filename ]
then
echo $filename exists.
else
echo $filename doesn¡¬¡¯t exist.
fi
$ ./stdio3
./stdio3: line: command not found
exists.
$ sh -x ./stdio3
++ line
./stdio3: line: command not found
+ filename=
+ [ -e ]
+ echo exists.
exists.
$ sh -ev ./stdio3
++ line
./stdio3: line: command not found
+ filename=
|
-e ¿É¼ÇÀ»
ÁÖ°í ½ÇÇàÇÑ °æ¿ì if ÀÌÀüÀÇ ½ÇÇ๮ÀÌ ½ÇÆÐ¸¦ ÇÏ¿© if °¡ ½ÇÇàµÇ±â Àü¿¡ Á¾·áÇÔÀ»
¾Ë ¼ö ÀÖ´Ù.
Á¶°Ç½Ä
Á¶°Ç½ÄÀ»
ÀϹÝÀûÀÎ ÄÄÆÄÀÏ ¾ð¾î¿¡¼¿Í ºñ½ÁÇÏ°Ô »ç¿ëÇÒ °æ¿ì »ý°¢Áöµµ ¾Ê´Â ¿¡·¯°¡ ¹ß»ýÇÏ´Â
°æ¿ì°¡ ÀÖ´Ù.
¼ö½Ä °Ë»ç
Á¶°Ç½Ä¿¡¼ °Ë»çÇÏ·Á´Â º¯¼ö°¡ Á¸ÀçÇÏÁö ¾Ê°Å³ª °ªÀÌ ¼³Á¤µÇÁö ¾Ê¾ÒÀ» °æ¿ì ¿¡·¯°¡
¹ß»ýÇÑ´Ù. Áï, ´ÙÀ½°ú °°Àº Á¶°Ç½Ä¿¡¼
count
º¯¼ö°¡ Á¸ÀçÇÏÁö ¾Ê°Å³ª °ªÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é ´ÙÀ½°ú °°ÀÌ ÇØ¼®ÀÌ µÇ¾î
¾Æ·¡¿Í °°Àº
¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
À̸¦ ¹æÁöÇϱâ
À§Çؼ´Â À§ÀÇ ¼ö½ÄÀ» ´ÙÀ½°ú °°ÀÌ ¹Ù²Û´Ù.
ÀÌ ¶§´Â
À§¿Í °°Àº ¿¡·¯ »óȲÀÏ ¶§ 0À» ¸®ÅÏÇÏ°Ô µÇ°í count º¯¼ö°ªÀÌ 3ÀÏ °æ¿ì¿¡´Â
03À» ¸®ÅÏÇÏ°Ô µÇ¾î ¿¡·¯¾øÀÌ Á¶°Ç½ÄÀÌ ¼öÇàÀÌ µÈ´Ù.
¹®ÀÚ¿ °Ë»ç
Á¶°Ç½Ä¿¡¼´Â °Ë»çÇÏ·Á´Â ¹®ÀÚ¿ÀÌ Á¶°Ç½Ä¿¡¼ »ç¿ëÇϴ Ű¿öµåÀÏ °æ¿ì ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
Áï, ±× ¹®ÀÚ¿ÀÌ -eq, -ne, -gt, -r, -w, -z, -fµîÀÇ °ÍµéÀÏ
¶§ÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â ºñ±³ÇÏ·Á´Â ¹®ÀÚ¿ ¾Õ¿¡ Àû´çÇÑ ¹®ÀÚ¸¦ Ãß°¡ÇÏ¿© ¾Õ¿¡¼¿Í °°Àº
°ÍµéÀÌ Á¶°Ç½Ä¿¡¼ ³ª¿ÀÁö ¾Êµµ·Ï ÇÑ´Ù.
¸¦ ´ÙÀ½°ú
°°ÀÌ º¯°æÀ» ÇÑ´Ù.
¾ÕÀÇ -e
¿É¼ÇÀ» ¼³¸íÇÒ ¶§ º¸¾Ò´ø °Í°ú °°ÀÌ ½© ½ºÅ©¸³Æ®¿¡¼ ½ÇÇ๮ÀÌ ½ÇÆÐÇÑ´Ù°í ÇØ¼ ½ºÅ©¸³Æ®°¡
ÁߴܵÇÁö´Â ¾Ê´Â´Ù. (ÁߴܽÃŰ·Á¸é -e ¿É¼ÇÀ» ÁÖ¾î¾ß ÇÑ´Ù.) ÇÏÁö¸¸ Áß´ÜÀÌ µÈ´Ù´Â
À߸øµÈ Âø°¢À» ÇÏ¿© ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ´ÙÀ½ÀÇ °æ¿ì¿¡´Â ±×°ÍÀÌ Ä¡¸íÀûÀÎ
°á°ú¸¦ ³ªÀ» ¼ö ÀÖ´Ù.
$ cat clean
#!/bin/sh
tempdir=¡¯/tmp
/usr/tmp /var/tmp¡¯
for dir
in $tempdir
do
cd $dir
rm -rf *
done
echo ¡°Cleanup
done !¡±
|
¡®cd $dir¡¯ÀÌ
½ÇÆÐÇÒ °æ¿ì¿¡µµ ´ÙÀ½ ½ÇÇ๮ÀÎ ¡®rm -rf *¡¯Àº ½ÇÇàÀÌ µÈ´Ù. cd°¡ ½ÇÆÐ¸¦
ÇÑ´Ù¸é »ý°¢Áöµµ ¾Ê´Â µð·ºÅ丮ÀÇ ³»¿ëÀ» ´Ù Áö¿ö¹ö¸®´Â °á°ú¸¦ ³ªÀ» ¼ö ÀÖ´Ù. ÀÌ·±
¹®Á¦¸¦ ¹æÁöÇϱâ À§ÇØ À̿Ͱ°ÀÌ ´ÙÀ½¿¡ Ä¡¸íÀûÀÎ ½ÇÇ๮ÀÌ ¿Ã °æ¿ì ÀÌÀüÀÇ ½ÇÇ๮ÀÌ
½ÇÆÐÇÏ¸é ½ÇÇàÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. || Á¶°ÇÀ» ÀÌ¿ë cd ½ÇÇ๮À» ¹Ù²Û´Ù.
ÀÌ °æ¿ì
|| ¾ÕÀÇ cd°¡ ½ÇÆÐÇÒ °æ¿ì exit°¡ ½ÇÇàµÇ¾î ´õ ÀÌ»ó ÁøÇàµÇÁö ¾Êµµ·Ï ÇÑ´Ù.
cd°¡ ¼º°øÇÑ °æ¿ì¿¡´Â || Á¶°Ç½ÄÀº Ç×»ó ÂüÀÌ µÇ±â ¶§¹®¿¡ || ¿ìÃøÀÇ exit´Â
½ÇÇàµÇÁö ¾Ê´Â´Ù. À§ÀÇ ¿¹Á¦¿¡¼´Â exit ´ë½Å continue¸¦ ½áµµ ¹«¹æÇÏ´Ù.
º¯¼ö°ª
È®ÀÎÇϱâ
½© ½ºÅ©¸³Æ®¿¡
´ëȽÄÀ¸·Î º¯¼ö°ªÀ» È®ÀÎÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ±×·± ±â´ÉÀ» ÇÏ´Â Äڵ带 ½©
½ºÅ©¸³Æ® Áß°£¿¡ »ðÀÔÇÏ´Â ¹æ¹ýÀÌ´Ù.
while
echo -n ¡°Enter a variable name you want to
know; ¡¬
just ENTER to quit: ¡°
read var
do
case ¡°$var¡± in
¡°¡±) break ;;
*) eval echo ¡¬$$var ;;
esac
done
ÀÌ Æ®·¹À̽º(trace)
ÄÚµå ÀÌÀü¿¡ »ç¿ëµÈ º¯¼öÀÇ °ªÀ» È®ÀÎÇØ º¼ ¼ö°¡ ÀÖ´Ù.
|
$ cat trace
#!/bin/sh
#
# trace: º¯¼ö°ªÀ» º¸¿©ÁÖ´Â Æ®·¹À̽º Äڵ带 »ç¿ëÇØ º»´Ù.
#
dir=`dirname
$0`
file=`basename $0`
count=0
for arg in
$*
do
count=`expr $count + 1`
# Trace code
while echo -n ¡°Enter a variable name
you want to know; just ENTER to quit:
¡°
read var
do
case ¡°$var¡± in
¡°¡±) break ;;
*) eval echo ¡¬$$var ;;
esac
done
done
$ ./trace a b cde fg h
Enter a variable name you want to know;
just ENTER to quit: dir
.
Enter a variable name you want to know;
just ENTER to quit: file
trace
Enter a variable name you want to know;
just ENTER to quit: count
1
Enter a variable name you want to know;
just ENTER to quit: arg
a
Enter a variable name you want to know;
just ENTER to quit: [ENTER]
Enter a variable name you want to know;
just ENTER to quit: count
2
Enter a variable name you want to know;
just ENTER to quit: arg
b
Enter a variable name you want to know;
just ENTER to quit: [ENTER]
Enter a variable name you want to know;
just ENTER to quit: count
3
Enter a variable name you want to know;
just ENTER to quit: arg
cde
Enter a variable name you want to know;
just ENTER to quit: [ENTER]
Enter a variable name you want to know;
just ENTER to quit: count
4
Enter a variable name you want to know;
just ENTER to quit: arg
fg
Enter a variable name you want to know;
just ENTER to quit: [ENTER]
Enter a variable name you want to know;
just ENTER to quit: count
5
Enter a variable name you want to know;
just ENTER to quit: arg
h
Enter a variable name you want to know;
just ENTER to quit: [ENTER]
|
([ENTER]˼
ENTER¸¦ ´·¶À½À» ÀǹÌÇÑ´Ù.)
°á·Ð
ÀÌÁ¦±îÁö
½© ½ºÅ©¸³Æ®ÀÇ ÀÛ¼º°ú µð¹ö±ë¿¡ °üÇÑ »çÇ×À» ¾Ë¾Æº¸¾Ò´Ù. ¹°·Ð Áö±Ý±îÁö ´Ù·é ³»¿ëÀÌ
½© ½ºÅ©¸³Æ®ÀÇ ÀüºÎ´Â ¾Æ´Ï´Ù. ÀÚÀßÇÏ°í ¹Ì¹¦ÇÑ ºÎºÐµé ÇÏÁö¸¸ Áß¿äÇÑ ºÎºÐµéÀº ´Ù·çÁö
¸øÇßÀ¸¸ç, ÇöÀç ¸¹ÀÌ »ç¿ëÇÏ´Â bash³ª tcshÀÇ È®Àå ±â´Éµµ ³²¾Æ ÀÖ´Ù. ÀÌÁ¦
±× ºÎºÐÀº µ¶Àڵ鿡°Ô ³²°ÜÁø ¸òÀ̸ç ÀÌ ±â»ç¸¦ ÅëÇØ ±× ½ÃÀÛÀ» ÇÒ ¼ö Àֱ⸦ ¹Ù¶õ´Ù.
ÀÏ´ÜÀº ´Ù¸¥ »ç¶÷µéÀÌ ¸¸µé¾î ³õÀº ½ºÅ©¸³Æ®¸¦ º¸°í ÀÌÇØÇÏ¸é¼ Äڵ带 ¼öÁ¤Çغ¸°í
ÇÊ¿äÇÑ ½ºÅ©¸³Æ®¸¦ Çϳª¾¿ ¸¸µé¾î °¡¸é¼ ÀÍÈ÷¸é µÉ °ÍÀÌ´Ù. ±×¸®°í ÀÛ¼ºÁß¿¡ ¸·È÷´Â
ºÎºÐÀº ¸Å´º¾ó ÆäÀÌÁö°¡ Å« µµ¿òÀÌ µÉ °ÍÀÌ´Ù. man bash !
Âü°íÀÚ·á
UNIX
POWER TOOLS, 2ed. Jerry Peek, Tim O¡¯Reilly,
Mike Loukides. O¡¯Reilly
bash ¸Å´º¾ó ÆäÀÌÁö
|