Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH:如何判断脚本是否使用exit?_Bash_Return Value_Exit_Difference_Subscript - Fatal编程技术网

BASH:如何判断脚本是否使用exit?

BASH:如何判断脚本是否使用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" |

假设我有两个脚本,它们只是从一个无用的下标打印返回代码:

脚本1

(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问题的方向前进。