【问题标题】:Exit code of previous command execution is always 0 -- In Remote Shell Execution $?先前命令执行的退出代码始终为 0 -- In Remote Shell Execution $?
【发布时间】:2018-12-16 14:02:20
【问题描述】:

我正在尝试执行一个脚本,在脚本的中途,它在远程 shell 中执行部分代码,然后再次返回到同一个本地 shell。

但是,我的问题是关于在远程 shell 中执行的命令的退出代码。我正在尝试根据退出代码使用 if-then-else 进行远程决策。当它没有按预期执行时,我试图缩小问题范围。

这是我的发现,

输出始终是 IP Found,如 $?总是等于 0。

ssh root@<remote server> bash -c "'
host www.google.com123
if [ $? != 0 ]
then
    echo "Invalid Host"
else
    echo "IP Found"
fi

'"

此外,在这种情况下,预期输出相同

ssh root@<remote server> bash -c "'
host www.google.com
if [ $? != 0 ]
then
    echo "Invalid Host"
else
    echo "IP Found"
fi

'"

参考:我是从here了解到这个远程执行方法的

请帮助我了解远程 shell 执行的这种行为。另外,如果有任何其他方法可以通过 ssh 远程执行部分 shell 脚本,请提出建议。

【问题讨论】:

    标签: linux bash shell unix


    【解决方案1】:

    最外面的引号是双引号,所以$? 在您远程运行bash 之前会在本地展开。相反,使用

    ssh root@<remote server> 'bash -c "
    host www.google.com123
    if [ \$? != 0 ]
    then
        echo \"Invalid Host\"
    else
        echo \"IP Found\"
    fi
    
    "'
    

    更简单的是完全避免检查$?

    ssh root@<remote server> 'bash -c "
    if ! host www.google.com123
    then
        echo \"Invalid Host\"
    else
        echo \"IP Found\"
    fi
    
    "'
    

    更简单的是不运行第二个不必要的shell。

    ssh root@<remote server> '
    if ! host www.google.com123
    then
        echo "Invalid Host"
    else
        echo "IP Found"
    fi
    '
    

    【讨论】:

    • 感谢您抽出宝贵时间解决此问题。我会明确提到 bash shell。以防 bash 以外的其他 shell 设置为默认值。
    • 尽量避免使用非标准的结构,因为在您想要的命令中没有bash 扩展,所以没有理由需要比符合 POSIX 的 shell 更具体的东西。
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2015-03-30
    • 2022-01-20
    • 2020-06-18
    • 2022-12-07
    相关资源
    最近更新 更多