linux - 先前命令执行的退出代码始终为 0——在远程 Shell 执行中 $?

标签 linux bash shell unix

我正在尝试执行一个脚本,在脚本的中间,它在远程 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

'"

Ref: 我从here 了解到这个远程执行方法

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

最佳答案

最外面的引号是双引号,因此 $? 在您远程运行 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
'

关于linux - 先前命令执行的退出代码始终为 0——在远程 Shell 执行中 $?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53802881/

相关文章:

linux - 如何检测文件已被删除

linux - 使用 awk 的脚本中出现未知错误

c - shell脚本 "Thread: command not found"

linux - 如何为 MXE 交叉编译器编译 Berkeley DB 5.3.28?

python - 使用 shell 保存包含日期和时间的文件

linux - 两个整数之间的 Bash 值,不是 float

linux - cURL:如果状态为200,如何返回0?

linux - centos强制使用特定版本的JAVA

bash - 在 Bash 脚本中按格式排序字符串数组

linux - Yocto - 尝试使用实时内核版本