转载请注明来源 http://blog.csdn.net/imred/article/details/39345667
最近在学习Linux Shell(bash),学到trap语句时遇到了一些困惑。我使用的书是《Linux程序设计》一书,也许是书上例子程序不够清晰,也许是个人理解能力的问题,对trap命令的工作方式理解总是模模糊糊,今天下午写了几个测试程序,有了一些新的理解。
我先把结论写下来:
- trap语句也是普通的语句,执行结束后执行下一条语句。
- trap语句不会改变程序执行的流程。
- trap语句执行时没有输出。
- trap语句执行后才会对信号处理产生影响。
- 多个trap语句对同一信号进行处理后,信号处理以最后一个执行的trap语句为准。
下面是测试程序:
#!/bin/sh
flag=1
key=1
for value in 1 2 3 4 5 6 7
do
echo "begin: ""value=""$value"
sleep 1
done
trap 'echo The first trap;flag=2;echo "flag=2"' INT
echo "The first loop begins"
while [ $flag = 1 ]
do
echo "flag=""$flag"
sleep 1
done
echo "The first loop ends"
trap 'echo The second trap;key=2;echo "key=2"' INT
echo "The second loop begins"
while [ $key = 1 ]
do
echo "key=""$key"
sleep 1
done
echo "The second loop ends"
exit 0
执行结果为:
- 在for循环执行时,由于之前没有trap语句,对SIGINT信号处理方式为默认方式,按下CTRL+C后程序退出。
- 第一个for循环时不按下CTRL+C,静待其执行结束,执行结束后向下执行,先执行一个trap语句,然后执行第一个while循环,在执行第一个while循环时,由于之前有一个trap语句执行过,对SIGINT处理方式变成trap语句中单引号中的内容,此时按下CTRL+C,flag值变为2,并输出一些内容。注意!此时程序执行的流程并未改变,还是在while循环中,并未跳转到第一个trap语句,因此第一个while语句之前的"The first loop begins"不会第二次输出。
- flag=2后跳出第一个while循环,执行第二个trap语句,然后执行第二个while循环,由于第二个trap语句的效果覆盖了第一个trap语句的效果,此时按下CTRL+C会改变key的值而非flag的值,因此程序跳出了第二个while循环,程序执行结束。
转载请注明来源 http://blog.csdn.net/imred/article/details/39345667