如何在shell脚本中获取最后一个Bash shell命令的成功状态?

时间:2014-01-30 21:20:26

标签: linux bash shell error-handling

有时我会经常连续调用两个命令。但是,第二个命令仅在第一个命令成功的情况下才有意义。

我想做这样的事情:

#!/bin/bash

if [ $? -gt 0 ]
then
    echo "WARNING: previous command entered at the shell prompt failed"
fi

但它不起作用:

t@quad:~$ echo "abc" | grep def
t@quad:~$ ./warnme.sh 
Last command succeeded

我想要的是有点像这样:

t@quad:~$ echo "abc" | grep def
t@quad:~$ echo ${PIPESTATUS[1]}
1

我们可以清楚地看到最后一个命令失败。

我想要的结果:

t@quad:~$ echo "abc" | grep def
t@quad:~$ ./warnme.sh 
WARNING: previous command entered at the shell prompt failed

我找不到办法。

3 个答案:

答案 0 :(得分:3)

command1 && command2

完全符合您的要求:仅当command1成功时才执行命令2。例如,您可以这样做:

ls a.out && ./a.out

然后只有在列出时才会执行a.out。我在http://www.linuxintro.org/wiki/%26%26

上记录了这个问题

答案 1 :(得分:1)

怎么样:

echo "abc" | grep def || ./warnme.sh

凡warnme.sh现在只是没有测试的警告。只有在第一个命令失败时才会调用它。

换句话说,它将与:

相同
echo "abc" | grep def || echo "WARNING: That didn't work..."

答案 2 :(得分:0)

一个选项是只在前一个成功的命令列表之前放置它:

set -e

如果脚本后面的任何命令返回非零(通常是失败),这将退出脚本。您可以使用以下命令再次将其关闭:

set +e

或者,如果您只想将其关闭一行,您可以将逻辑 - 或命令与true:

mycommand || true

对于我的很多脚本,我已经在脚本的顶部设置-e作为安全功能,以防止脚本级联并做一些危险的事情。