Bash脚本退出方法探讨:exec $SHELL是否最优及无残留环境退出方案
Shell脚本退出方式的疑问解答
原脚本代码
#################### System Information Tests ############################## export HOME=`cd;pwd` export Storage_Space_Size=$(df -h --output=avail ${HOME} | awk 'NR==2 {print $1}' | tr -cd '[:digit:]') export Storage_Space_Units=$(df -h --output=avail ${HOME} | awk 'NR==2 {print $1}' | tr -cd '[:alpha:]') export Storage_Space_Required="350" echo " Testing for Storage Space for installation" echo " " case $Storage_Space_Units in [Pp]* ) echo "Sufficient storage space for installation found" ;; [Tt]* ) echo "Sufficient storage space for installation found" ;; [Gg]* ) if [[ ${Storage_Space_Size} -lt ${Storage_Space_Required} ]]; then echo "Not enough storage space for installation" else echo "Sufficient storage space for installation found." fi ;; [MmKk]* ) echo "Not enough storage space for installation." exec $SHELL ;; * ) echo "Not enough storage space for installation." exec $SHELL ;; esac echo " "
问题解答
1. exec $SHELL是不是退出脚本的最佳方式?
不是。exec $SHELL的作用是用新的Shell进程替换当前脚本进程,本质是启动了一个新的交互式Shell,而非真正退出脚本。这样做会导致原脚本进程未终止,反而进入新Shell,且脚本中设置的环境变量会被新Shell继承,完全达不到“不保留失败环境”的目的,显然不是合适的退出方式。
2. 不保留失败环境的脚本退出方法
有几种更规范的方式:
exit命令:直接使用exit 1(非0状态码表示执行失败),会立即终止当前脚本进程,进程结束后对应的环境会被销毁,不会保留失败环境。同时,调用该脚本的父进程可以通过状态码判断执行结果,这是最常用的退出方式。只需把脚本中的exec $SHELL替换成exit 1即可。kill $$:$$代表当前脚本的进程ID,kill $$会直接杀死当前进程,效果和exit类似,但exit是Shell内置命令,更规范且兼容性更好。- 如果脚本作为函数调用:可以用
return 1退出函数,但独立脚本中还是exit更合适。
内容的提问来源于stack exchange,提问作者user19557344
相关产品推荐
相关产品推荐

