명령어 대치를 막기위해 작은 따움표 사용한 예:
#!/bin/sh trap 'echo `pwd` >>$HOME/errdir' 2 3 15 for i in /bin /usr/bin /usr/any/bin do cd $i some series of commands in the directory $i done
이 스크립트를 실행하다가, 인터럽트(2, 3, 15 시그날이 보내져서 스크립트가 종료되는 것)시키면, 그 당시 작업 디렉토리 이름이 errdir 파일에 기록될 것입니다. 만약 이때, 작은 따움표 대신에 다음과 같이 큰따움표를 사용하게 되면 어떻게 될까요?
trap "echo `pwd` >errdir" 2 3 15
이렇되면, errdir 파일에는 이 스크립트를 실행한 그 당시의 작업 디렉토리가 기록 될 것입니다. 왜냐하면, 큰따움표로 묶겨 있을 경우에는, 쉘 스크립트는, pwd 명령이 처음으로 읽혀지면 바로 그 결과로 대치해 버리는 작업을 해버리기 때문입니다.
인트럽트 발생시, 임시파일 지우기:
#!/bin/sh temp=/tmp/file.$$ trap 'rm $temp; exit' 0 1 2 3 15 ls > $temp .....
쉘 스크립트가 실행도중, 지정한 시그날이 감지되면, rm $temp; exit 부분을 실행할 것입니다. exit 명령은 더 남아 있는 부분이 있건 말건 간에 무조건 쉘 스크립트 자체를 종료하지요.
trap 명령 사용 후에 명령들 처리하기:
#!/bin/sh
# read and process commands
dir=`pwd`
for i in *
do
if test -d $dir/$i
then
cd $dir/$i
while echo ''$i:''
trap exit 2 # trap ^C
read x
do
trap ' ' 2 # ignore interrupts
eval $x
done
fi
done
윗 스크립트의 경우는 trap 명령을 사용한 뒤에 다른 명령들을 어떻게 처리하는 지를 보여줍니다. 사용자의 입력을 기다리는 read 명령 부분에서, ^C 문자가 감지되면 스크립트를 마치겠지만, 그렇지 않다면, 나머지 작업을 계속합니다. 다음부분의 trap 명령에서는, 명령목록 부분에서 아무런 명령을 지정하지 않은 따움표가 사용되어, 결국 쉘에 의해서, 시그날이 무시됩니다.