Unix/Linux脚本中"set -e"的作用

编写shell脚本没多久,对于其许多命令的具体用法还不太熟悉。最近刚好有需求,就尝试用脚本去实现。其中就有用到set -e选项。
        在用这个命令之前,也查过其功能,描述比较简单:就是当命令以非零状态退出时,则退出shell。主要作用是,当脚本执行出现意料之外的情况时,立即退出,避免错误被忽略,导致最终结果不正确。这里主要讨论的是set -e 选项的作用范围,创建如下测试文件:

[plain]  view plain  copy
  1. zhenglei@SzExdroid14:~/study/scripts$ cat run.sh  
  2. #!/bin/bash  
  3. set -e  
  4.   
  5. test_dir/set.sh  
  6. zhenglei@SzExdroid14:~/study/scripts$ cat test_dir/set.sh  
  7. #!/bin/bash  
  8. set -e  
  9.   
  10. function return1()  
  11. {  
  12.         return 1  
  13. }  
  14. function return0()  
  15. {  
  16.         return 0  
  17. }  
  18. function returnf()  
  19. {  
  20.         return $1  
  21. }  
  22.   
  23. echo "run start"  
  24. return1  
  25. if [ $? -ne 0 ];then  
  26.         echo "cmd error"  
  27. fi  
  28. echo "run end !"  

单独执行test_dir/set.sh时打印如下:

[python]  view plain  copy
  1. zhenglei@SzExdroid14:~/study/scripts$ ./test_dir/set.sh  
  2. run start  

即return1语句返回非零,立即退出执行。说明set -e 选项有效。接着将test_dir/set.sh中的set -e 屏蔽掉再执行run.sh时:

[python]  view plain  copy
  1. zhenglei@SzExdroid14:~/study/scripts$ ./run.sh  
  2. run start  
  3. cmd error  
  4. run end !  

打印和程序流程相符。说明run.sh中set -e选项在set.sh中不起作用。看似此选项的只作用于当前脚本,不作用于其所调用的脚本。如此?
将run.sh脚本修改如下,并执行:

[python]  view plain  copy
  1. zhenglei@SzExdroid14:~/study/scripts$ cat run.sh  
  2. #!/bin/bash  
  3. set -e  
  4.   
  5. . test_dir/set.sh  
  6. zhenglei@SzExdroid14:~/study/scripts$ ./run.sh  
  7. run start  

说明set -e 选项对set.sh起作用。脚本作为一个进程去描述set -e选项的范围应该是:set -e选项只作用于当前进行,不作用于其创建的子进程。
set -e 命令用法总结如下:
1. 当命令的返回值为非零状态时,则立即退出脚本的执行。
2. 作用范围只限于脚本执行的当前进行,不作用于其创建的子进程。
3. 另外,当想根据命令执行的返回值,输出对应的log时,最好不要采用set -e选项,而是通过配合exit 命令来达到输出log并退出执行的目的。

注:编译此文档时,出现行间距不一致的情况 ,编辑器也没找到可调整的菜单。结果发现shift + enter / delete 键可以比较方便的控制。

猜你喜欢

转载自blog.csdn.net/bbbeoy/article/details/80308516