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

标签 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 $?"

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

最佳答案

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

要获得正确的结果,请尝试 bash -c 'false;回显 $?'。这可以防止变量扩展,它会在解释时扩展。

对于此处的文档版本,请执行以下操作:

bash << 'EOF'
false
echo $?
'EOF'

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

关于bash - 为什么 bash -c "false; echo $?"打印 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31112579/

相关文章:

bash - 用于递归列出目录中较大文件的 shell 脚本

bash - 如何使用 bash 对目录中的每个文件执行某些操作?

bash - Bash : Error Handling from the nested function

macos - 如何替换通过麦克风传来的声音? OS X

objective-c - 你如何在 Objective-C 中检索可用物理 RAM 的数量?

linux - Unix Diff 命令比较 2 个 txt 文件之间的差异并生成更多命令

linux - SCP从远程服务器传输在特定时间后修改的文件

linux - 如何在不丢失当前命令的情况下重置终端?

c - mmaping 大文件(用于持久性大数组)

python - 颠覆没有通过 python 脚本看到我的更新