BASH:如何判断脚本是否使用exit?
假设我有两个脚本,它们只是从一个无用的下标打印返回代码: 脚本1BASH:如何判断脚本是否使用exit?,bash,return-value,exit,difference,subscript,Bash,Return Value,Exit,Difference,Subscript,假设我有两个脚本,它们只是从一个无用的下标打印返回代码: 脚本1 (echo; exit 0) echo $? 脚本2 (echo) echo $? 两者都返回0。但是有没有办法告诉我们第一个下标显式地使用了exit命令?经过一些研究,我取得了一些突破。也就是说,您可以设置一个exit\u处理程序,该处理程序只需检查最后一个命令即可判断是否存在退出调用 #! /bin/bash exit_handler () { ret=$? if echo "$BASH_COMMAND" |
(echo; exit 0)
echo $?
脚本2
(echo)
echo $?
两者都返回
0
。但是有没有办法告诉我们第一个下标显式地使用了exit
命令?经过一些研究,我取得了一些突破。也就是说,您可以设置一个exit\u处理程序
,该处理程序只需检查最后一个命令即可判断是否存在退出调用
#! /bin/bash
exit_handler () {
ret=$?
if echo "$BASH_COMMAND" | grep -e "^exit " >> /dev/null
then
echo "it was an explicit exit"
else
echo "it was an implicit exit"
fi
exit $ret
}
trap "exit_handler" EXIT
exit 22
这会打印出来
it was an explicit exit
现在,为了告诉父级,我们可以编写一个文件,一个命名管道或任何东西,而不是回音
根据choroba的说明,
exit
无参数将给出隐式调用
,这是公认的错误,因为exit
(无参数)与exit$?
相同。因此,正则表达式必须考虑:
#! /bin/bash
exit_handler () {
ret=$?
if echo "$BASH_COMMAND" | grep -e "^exit \|^exit$" >> /dev/null
then
echo "it was an explicit exit"
else
echo "it was an implicit exit"
fi
exit $ret
}
trap "exit_handler" EXIT
exit 22
我不知道。为什么要这样做?请使用不同于0的值退出以指示退出。我很困惑。如果您最后一次运行脚本,那么退出代码将自动成为脚本的退出代码(即使您自己使用
exit
退出)。否。脚本退出时不会公开,只会公开它们已使用特定代码退出。除非解析脚本的源代码,否则无法区分脚本是如何退出的。您需要调用shell脚本。如果有人将实现自己的陷阱“rm-f$tmpfile;退出“0”
,该怎么办?!这是在退出时删除临时文件的常见做法,您的“退出陷阱”将被覆盖。简单地说,这不是一个好主意-糟糕的逻辑和错误的解决方案,正如有人告诉您的X-Y问题…您正在每个script1
和script2
中实现exit\u handler()。如果script2
中的最后一个命令是echo“现在该退出了”
,该怎么办?我考虑到了这一点。它不应该与regex^exit
一起传递,因为regex只允许以exit开头,后跟空格的命令。唯一可以使用的命令是exit
看起来是个不错的解决方案。我重新访问了manbash
的Shell变量部分。我想你想出了一个好办法。我唯一好奇的是它在BASH_COMMAND
中的描述方式,特别是它是在陷阱发生时执行的命令。显然,它正在工作,但如果看到它是陷阱出现之前执行的最后一个命令,那将令人放心。哦,好吧,我还是喜欢:)如果我删除22
,我会得到“隐式退出”。“XY问题”发生在有人试图通过执行Y来解决问题X时,但无法完成,所以他们向社区询问Y。问题是Y毫无意义,问题的主题应该是X。你已经通过Y获得了动力,并且正在向将来发布Z问题的方向前进。