为什么bash -c“false; echo $?”打印0?

时间:2015-06-29 09:49:56

标签: bash unix

我正在构建一个尝试在服务器上运行某些命令的脚本(通过SSH),并在屏幕上写入是否成功。

我注意到$?的一个奇怪的行为,即当前一个命令失败时不是0

最初,我有:

ssh <user>@<server> <<EOF
    false
    if [ $? -ne 0 ]; then
        echo "It failed"
    else
        echo "It worked"
    fi
EOF

如果我将脚本复制并粘贴到<<EOFEOF中,则会打印It failed。如果我使用ssh部分运行它,则会打印It worked。为了简化,我尝试了:

ssh <user>@<server> <<EOF
    false
    echo $?
EOF

同样的事情发生了。如果我在里面复制粘贴或输入命令,它会打印1,但是如果我运行所有命令(包括ssh),它会打印0

如果我直接以这种方式使用bash,就会发生同样的错误

bash <<EOF
    false
    echo $?
EOF

bash -c "false; echo $?"

为什么会这样?如何在此上下文中检查上一个命令是否失败?

1 个答案:

答案 0 :(得分:9)

这是由于可变扩展。当您编写bash -c "false; echo 0;"时,变量会在命令运行之前展开。因此,如果您之前的命令成功,那么您的命令与bash -c 'false; echo $?'完全相同。

要获得正确的结果,请尝试bash << 'EOF' false echo $? 'EOF' 。这可以防止变量扩展,在解释时会扩展。

对于这里的文档版本:

tcsh

在这种情况下,您需要引用此文档的分隔符。但要注意,必须使用的语法是用于键入命令的shell的语法。在示例中,我在bash,它需要使用完全相同的开始和结束分隔符。在{{1}}下,结束分隔符必须是引用删除后的开头分隔符。