我正在构建一个脚本,尝试在服务器上(通过 SSH)运行一些命令,并在屏幕上显示它们是否成功。
我注意到 $?
有一个奇怪的行为,即当上一个命令失败时它不是 0
。
最初,我有:
ssh <user>@<server> <<EOF
false
if [ $? -ne 0 ]; then
echo "It failed"
else
echo "It worked"
fi
EOF
如果我将脚本复制并粘贴到 <<EOF
和 EOF
中,它会打印 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/