shell脚本中是否有一种方法,如果[<script exits =“” with =“” non-0 =“” value =“”>]然后;做<某事>

时间:2019-01-21 22:10:10

标签: linux shell unix

在shell脚本中,我想这样做 如果Shell脚本失败(退出时返回非零值),则在退出进程之前,执行一些操作。

如何在shell脚本中插入这样的if语句块。

那可行吗?

例如

  set -e
回声$密码> Confidential.txt
rm <不存在的文件>
rm secret.txt
 

我要确保确保始终删除 confidential.txt

3 个答案:

答案 0 :(得分:3)

使用trap命令:

trap 'if [ $? -ne 0 ]; then echo failed; fi' EXIT

EXIT陷阱在脚本退出时运行,并且$?包含退出前最后一条命令的状态。

请注意,shell脚本的退出状态是它执行的最后一个命令的状态。因此,在您的脚本中,它将是

的状态
rm confidential.txt

不是错误

rm filethatdoesnotexist

除非您在脚本中使用set -e,否则任何命令遇到错误后,脚本都会立即退出。

答案 1 :(得分:2)

trapEXIT伪信号一起使用:

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

由于文件已被删除,因此可以保证脚本(或它开始继承其文件描述符的最后一个程序)退出或被杀死时,文件系统就有资格进行垃圾回收。如果以不允许诱捕或信号处理的方式杀死它。