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

3
有时候我会连续使用两个命令,但第二个命令只在第一个命令运行成功后才有意义。我想做的事情是这样的:
#!/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

我找不到方法去做它。


一个 shell 脚本是一个全新的 shell,因此需要一个新的调用。你需要它作为一个独立的 shell 脚本,还是在你的 bashrc 中定义一个函数或别名就足够了? - Wrikken
@Wrikken:我需要它作为一个shell脚本。有没有一种方法,可以在给定父shell的PID(可访问)的情况下,访问父shell的$?变量(保存上一个命令结果的变量)?也许这应该是一个新问题? - bitcoinNeverSleeps
据我所知,没有。你可以明确将要求它必须是一个shell脚本加入到你的问题中,也许有更多经验的人会知道一些解决方法,但恐怕答案可能是没有实际可行的方法。 - Wrikken
3个回答

4
command1 && command2

这个命令可以完全按照你的要求执行:只有当命令1成功执行后,命令2才会被执行。例如,你可以这样做:

ls a.out && ./a.out

只有当能够列出 a.out 时,它才会被执行。我在维基博客中介绍了这个问题:http://www.linuxintro.org/wiki/%26%26


2

一种选项是将此选项放置在仅在前一个成功时要执行的命令列表之前:

set -e

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

set +e

或者,如果您只想关闭一行代码的此功能,可以将命令与true逻辑OR。

mycommand || true

对于我很多的脚本,我在脚本顶部设置了-e作为安全特性,以防止脚本级联并执行危险操作。


1
怎么样?
echo "abc" | grep def || ./warnme.sh

其中,warnme.sh现在只是一个警告而没有测试。仅在第一个命令失败时才会调用它。

换句话说,这与以下内容相同:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接