加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 18:28:44 所属栏目:安全 来源:网络整理
导读:我正在构建一个尝试在服务器上运行某些命令的脚本(通过SSH),并在屏幕上写入它们是否成功. 我注意到$?的奇怪行为,即在前一个命令失败时不为0. 最初,我有: ssh user@server EOF false if [ $? -ne 0 ]; then echo "It failed" else echo "It worked" fiEOF
我正在构建一个尝试在服务器上运行某些命令的脚本(通过SSH),并在屏幕上写入它们是否成功.

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

最初,我有:

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

如果我将脚本复制并粘贴到<<< EOF和EOF中,则打印失败.如果我用ssh部分运行它,它打印它工作.为了简化,我尝试了:

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; echo $?’.这可以防止变量扩展,在解释时会扩展.

对于这里的文档版本:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读