如果在 ssh 命令中使用 set 命令,则 set -o pipefail 在远程主机上无法正确评估。示例 ssh hostname “set -o pipefail; false | true; echo $?” - 给出 0(非预期)ssh hostname 'set -o pipefail; false | true; echo $?' - 给出 1(预期)
当命令用双引号括起来时,我们如何在远程主机上正确评估 set 命令。我将不得不在 ssh 命令中使用局部变量,因此需要双引号
答案1
我必须在 ssh 命令中使用局部变量,因此需要双引号
这正是您遇到的问题:您允许 shell$?
像局部变量一样进行扩展。set
命令被正确评估,但它们的效果不可见,因为后面的命令只是echo 0
,而不是echo $?
。
因此,您需要混合使用本地和远程扩展,即"echo \$?"
在适当的地方使用反斜杠转义。
(在一个几乎不相关的注释中,当你使用本地扩展来构建远程命令时,修饰符${var@Q}
(Bash 5.0 中的新功能)可以方便地生成正确的远程引用字符串;例如ssh foo "bar -i ${baz@Q}"
。