在shell脚本中,我想这样做 如果Shell脚本失败(退出时返回非零值),则在退出进程之前,执行一些操作。
如何在shell脚本中插入这样的if语句块。
那可行吗?
例如
set -e
回声$密码> Confidential.txt
rm <不存在的文件>
rm secret.txt
我要确保确保始终删除 confidential.txt
答案 0 :(得分:3)
使用trap
命令:
trap 'if [ $? -ne 0 ]; then echo failed; fi' EXIT
EXIT
陷阱在脚本退出时运行,并且$?
包含退出前最后一条命令的状态。
请注意,shell脚本的退出状态是它执行的最后一个命令的状态。因此,在您的脚本中,它将是
的状态rm confidential.txt
不是错误
rm filethatdoesnotexist
除非您在脚本中使用set -e
,否则任何命令遇到错误后,脚本都会立即退出。
答案 1 :(得分:2)
将trap
与EXIT
伪信号一起使用:
remove_secret () {
rm -f /path/to/confidential.txt
}
trap remove_secret EXIT
如果脚本以0退出,您可能不希望保留该文件,因此EXIT
的发生与退出代码无关。
请注意,如果没有set -e
,则在不存在的文件上没有rm
不会停止脚本。
答案 2 :(得分:0)
假设您使用的是Linux(或带有/proc/*/fd
的其他操作系统),您还有一个更好的选择:删除confidential.txt
,然后再完全输入密码。
看起来可能类似于以下内容:
exec 3<>confidential.txt
rm -f -- confidential.txt
printf '%s\n' "$password" >&3
...然后从已删除的文件中读取:
cat "/proc/$$/fd/3" ## where $$ is the PID of the shell that ran the exec command above
由于文件已被删除,因此可以保证脚本(或它开始继承其文件描述符的最后一个程序)退出或被杀死时,文件系统就有资格进行垃圾回收。如果以不允许诱捕或信号处理的方式杀死它。