2016-09-29 236 views
1

我的bash脚本(init.sh)调用另一个脚本(script.sh),我想在init.sh做任何进一步的行动之前,从script.sh测试误码测试错误代码。
我想和$?测试它,但它不工作在bash脚本,从一个叫脚本

init.sh是这样的:

#!/bin/bash 
set -e 
echo "Before call" 
docker run -v $PWD:/t -w /t [command] 
if [ $? == 1 ]; then 
     echo "Issue" 
fi 
echo "After call" 

我只能从stdout,而不是After call得到了Before call

我知道一个事实,如果我错了与执行参数单独docker run -v $PWD:/t -w /t [command],然后echo $?将正确地显示1

我在想,我不从scrip.sh赶上退出代码,而是从别的地方。

任何想法?

+1

这很混乱......你提到'script.sh',但不要在你的'init.sh'中调用它。无论如何,你可以尝试运行'bash -x init.sh'并看看它实际上在做什么。 – gilez

+1

使用'set -e',如果对'docker' *的调用将'$?'设置为1,您的脚本将在'if'语句执行之前退出,更不用说最后的'echo'调用。 – chepner

回答

2

你运行该脚本set -e。这意味着如果任何命令以非零状态退出,bash将停止执行所有后续行。因此,在这里,如果docker以状态1退出,则下面的条件根本没有机会运行。试试这个:

#!/bin/bash 
set -e 
echo "Before call" 
if ! docker run -v $PWD:/t -w /t [command]; then 
     echo "Issue" 
fi 
echo "After call" 

这将运行如果测试其抑制了set -e我上述的效果,让你有机会捕获错误里面的命令。注意这也将捕获所有非零状态,不仅仅是1.

+0

感谢**非常有价值的信息。它已经完成了! – Mornor

+0

'set -e' [*通常不是一个好主意](http://mywiki.wooledge.org/BashFAQ/105)。 – chepner

+0

@chepner你是对的。事实上,我想这个问题本身就是一个例子。 – redneb

1

击数值比较运算符是-eq,而不是== ...
所以:

#!/bin/bash 
set -e 
echo "Before call" 
docker run -v $PWD:/t -w /t [command] 
if [ $? -eq 1 ]; then 
     echo "Issue" 
fi 
echo "After call" 
+0

这当然是一个好点。我试过了,失败了:( – Mornor

+0

它有点不相关;没有任何'$?'可能会导致'$?-eq 1'和'$?= 1'的值(使用''带''[ ',而不是'==')表现不同。 – chepner

+0

@Mornor:为什么失败?因为该命令没有以'-1'退出?或者为什么?你应该回声$'的价值?',以测试它的价值... – MarcoS

1

set -e通常是一个坏主意。当然,在出现意外错误的情况下让脚本自动退出似乎是个不错的主意,但问题在于set -e,并且您可能对构成致命错误的内容有不同的看法。

相反,请自行处理错误。

#!/bin/bash 
echo "Before call" 
docker run -v $PWD:/t -w /t [command] 
docker_status=$? 
if [ $docker_status != 0 ]; then 
    echo "docker returned: $docker_status" 
    exit $docker_status 
fi 
echo "After call" 

在这个简单的代码,我已经有点冗余的$?的价值首先保存到另一个变量。这可以确保在开始执行其他检查,记录或以其他方式处理$?的值的命令后,它将被保留。另外,我正在登录并退出任意非零状态,而不仅仅是1.理论上,退出状态1的退出状态可能不同于退出状态2,但在此我们采用相同的操作日志然后退出任何错误的行动。