我的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 $?
获取退出代码,而是从其他地方获取退出代码。
有什么想法吗?
答案 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操作。