在bash脚本中,测试来自被调用脚本的错误代码

时间:2016-09-29 14:55:01

标签: bash shell

我的bash脚本(init.sh)调用另一个脚本(script.sh),我想在script.sh中执行任何进一步操作之前测试来自init.sh的错误代码。
我考虑过使用$?对其进行测试,但它不起作用

我的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"

我只收到Before call的{​​{1}}而不是stdout

我知道如果我单独用错误的参数执行After call,那么docker run -v $PWD:/t -w /t [command]将正确显示1.

我原以为我没有从echo $?获取退出代码,而是从其他地方获取退出代码。

有什么想法吗?

3 个答案:

答案 0 :(得分: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"

这会在if测试中运行命令,它会抑制上面描述的set -e的影响并让你有机会发现错误。请注意,这也将捕获所有非零状态,而不仅仅是1。

答案 1 :(得分:1)

Bash数字比较运算符为-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"

答案 2 :(得分:1)

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.理论上,您可能对退出状态为1而不是退出状态为2采取不同的操作,但是在这里我们对任何错误采取相同的log-then-exit操作。