首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中是否有一种方法,如果[ <script以非-0 value>形式退出],那么;执行<something>

在shell脚本中是否有一种方法,如果[ <script以非-0 value>形式退出],那么;执行<something>
EN

Stack Overflow用户
提问于 2019-01-21 22:10:10
回答 3查看 52关注 0票数 1

在shell脚本中,如果shell脚本失败(非零值退出),那么在退出进程之前,执行一些操作。

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

那可行吗?

例如,

代码语言:javascript
复制
set -e
echo $password > confidential.txt
rm <file-that-does-not-exist>
rm confidential.txt

我想确保confidential.txt被移除。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-21 22:18:48

trapEXIT伪信号一起使用:

代码语言:javascript
复制
remove_secret () {
    rm -f /path/to/confidential.txt
}
trap remove_secret EXIT

如果脚本以0退出,您可能不希望文件保持不变,因此无论退出代码如何,EXIT都会发生。

注意,如果没有set -e,不存在的文件上的rm不会停止脚本。

票数 1
EN

Stack Overflow用户

发布于 2019-01-21 22:16:59

使用trap命令:

代码语言:javascript
复制
trap 'if [ $? -ne 0 ]; then echo failed; fi' EXIT

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

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

代码语言:javascript
复制
rm confidential.txt

而不是来自

代码语言:javascript
复制
rm filethatdoesnotexist

除非在脚本中使用set -e,否则任何命令一旦出现错误,它就会退出。

票数 3
EN

Stack Overflow用户

发布于 2019-01-21 22:45:59

假设您在Linux上(或者使用/proc/*/fd的另一个操作系统),您有一个更好的选项:在将密码放入其中之前删除confidential.txt

它可以如下所示:

代码语言:javascript
复制
exec 3<>confidential.txt
rm -f -- confidential.txt
printf '%s\n' "$password" >&3

然后,从已删除的文件中读取...and:

代码语言:javascript
复制
cat "/proc/$$/fd/3"  ## where $$ is the PID of the shell that ran the exec command above

因为文件已经被删除,所以在脚本(或它开始继承其文件描述符的最后一个程序)退出或终止时,它就保证有资格由您的文件系统进行垃圾收集,即使它是以不允许陷阱或信号处理发生的方式被杀死的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54298458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档