2017-01-12 161 views
7

的退出代码这是myscript.sh击:陷阱

#!/bin/bash 

function mytrap { 
    echo "Trapped!" 
} 
trap mytrap EXIT 

exit 3 

当我运行它:

> ./myscript.sh 
echo $? 
3 

为什么是脚本的退出代码的陷阱一样的退出代码没有它?通常,函数隐式返回最后执行的命令的退出代码。在这种情况下:

  1. 回声返回0
  2. 我希望mytrap返回0
  3. 由于mytrap是最后执行的功能,脚本应该返回0

这是为什么不案件?我的思想在哪里错了?

+1

人提示:这是一个好主意,始终使用'设置-e'并在“设置-o pipefail”你bash脚本。一旦一个命令失败,这将立即停止脚本。它可以让你在半焙烤状态下做愚蠢的事情之前发现错误并中止。 –

回答

6

从下面man bash页看基准,

出口[n]的 导致shell与n的状态退出。如果省略n,则退出状态是最后执行的命令的状态。执行陷阱执行之前 shell终止。

你必须在脚本的调试版本证明,

+ trap mytrap EXIT 
+ exit 3 
+ mytrap 
+ echo 'Trapped!' 
Trapped! 

考虑一样的,你在你的评论中提到,该trap函数返回一个错误代码,

function mytrap { 
    echo "Trapped!" 
    exit 1 
} 

看看脚本的扩展版本,

+ trap mytrap EXIT 
+ exit 3 
+ mytrap 
+ echo 'Trapped!' 
Trapped! 
+ exit 1 

echo $? 
1 

为了捕捉退出代码上trap功能,

function mytrap { 
    echo "$?" 
    echo "Trapped!" 
} 
+0

所以有退出后执行的命令?我可以运行另一个出口吗?然后脚本的退出代码是什么?这会导致无限的陷阱循环吗? – dangonfast

+2

如果您在陷阱代码中放置了“退出1”,那将是脚本的退出代码。 – codeforester

+0

@delavnog:引用codeforester的点 – Inian