2014-09-04 54 views
0

说我有两个脚本,只是从没用标打印回返回代码:BASH:如何判断脚本是否使用退出?

SCRIPT1

(echo; exit 0) 
echo $? 

SCRIPT2

(echo) 
echo $? 

两个回馈0。但是有没有办法告诉第一个下标明确使用exit命令?

+2

不是我所知道的。你为什么想这样做? – 2014-09-04 18:01:56

+0

只需以不同于0的值退出以指示退出。 – choroba 2014-09-04 18:02:57

+0

@EtanReisner假设我正在制作其他脚本的包装。 – Pithikos 2014-09-04 18:04:43

回答

1

经过一番研究,我获得了一些突破。也就是说,您可以设置一个exit_handler,通过简单地检查最后一条命令来确定是否有退出呼叫。

#! /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的注意到没有参数会给implicit call,这是公认的错误的,因为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

您正在每个'script1'和'script2'中实现'exit_handler()'。如果'script2'中的最后一个命令是'echo',现在该退出“'了? – 2014-09-04 20:56:40

+0

我考虑到了这一点。它不应该与正则表达式'^ exit'一起传递,因为正则表达式只允许以退出后跟一个空格开始的命令。唯一的命令是'exit' – Pithikos 2014-09-04 21:04:38

+0

看起来是一个很好的解决方案。我重新访问了'man bash'的'Shell Variables'部分。我认为你遇到了一个很好的解决方案。我唯一的好奇心就是'BASH_COMMAND'中描述的方式,具体来说,**它是在陷阱**时执行的命令。显然它正在工作,但看到**这是在陷阱**之前执行的最后一个命令将是令人欣慰的。哦,我仍然喜欢它:) – 2014-09-04 21:16:39