Linux Shell 初学者对trap语句的思考

 转载请注明来源 http://blog.csdn.net/imred/article/details/39345667

       最近在学习Linux Shell(bash),学到trap语句时遇到了一些困惑。我使用的书是《Linux程序设计》一书,也许是书上例子程序不够清晰,也许是个人理解能力的问题,对trap命令的工作方式理解总是模模糊糊,今天下午写了几个测试程序,有了一些新的理解。

        我先把结论写下来:

  1. trap语句也是普通的语句,执行结束后执行下一条语句。
  2. trap语句不会改变程序执行的流程。
  3. trap语句执行时没有输出。
  4. trap语句执行后才会对信号处理产生影响。
  5. 多个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
        执行结果为:

  1. 在for循环执行时,由于之前没有trap语句,对SIGINT信号处理方式为默认方式,按下CTRL+C后程序退出。
  2. 第一个for循环时不按下CTRL+C,静待其执行结束,执行结束后向下执行,先执行一个trap语句,然后执行第一个while循环,在执行第一个while循环时,由于之前有一个trap语句执行过,对SIGINT处理方式变成trap语句中单引号中的内容,此时按下CTRL+C,flag值变为2,并输出一些内容。注意!此时程序执行的流程并未改变,还是在while循环中,并未跳转到第一个trap语句,因此第一个while语句之前的"The first loop begins"不会第二次输出。
  3. flag=2后跳出第一个while循环,执行第二个trap语句,然后执行第二个while循环,由于第二个trap语句的效果覆盖了第一个trap语句的效果,此时按下CTRL+C会改变key的值而非flag的值,因此程序跳出了第二个while循环,程序执行结束。

转载请注明来源 http://blog.csdn.net/imred/article/details/39345667

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值