我正在生成这样的脚本
(echo "ssh hans@mymachine.com echo hello" ; echo 'echo Done')
产生
ssh hans@mymachine.com echo hello
echo Done
如果我将生成的脚本存储在文件
中(echo "ssh hans@mymachine.com echo hello" ; echo 'echo Done') > a.sh
并执行它
. ./a.sh
然后它工作oke并生成
Warning: No xauth data; using fake authentication data for X11 forwarding.
hello
Done
如果我通过将这些命令传递给bash
来执行脚本(echo "ssh hans@mymachine.com echo hello" ; echo 'echo Done') | bash
结果是
Warning: No xauth data; using fake authentication data for X11 forwarding.
hello
正如您所见,bash没有执行'echo Done'命令。
我的第一个想法是ssh可能会产生由此xauth警告引起的非零返回值probaby。所以我做了这个
ssh hans@mymachine.com echo hello
echo $?
产生了
Warning: No xauth data; using fake authentication data for X11 forwarding.
hello
0
所以返回值是oke。现在我尝试使用陷阱
trap "" ERR
但这也没有帮助。非常符合逻辑,因为返回值无论如何都是零。
所以我迷路了。为什么'echo Done'命令没有被执行?
更新:
我注意到当我用括号包装脚本时,它可以工作。所以
( echo "(" ; echo "ssh hans@mymachine.com echo hello" ; echo 'echo Done'; echo ")" ) | bash
产生
Warning: No xauth data; using fake authentication data for X11 forwarding.
hello
Done
答案 0 :(得分:3)
ssh
正在消耗stdin,在这种情况下是echo
。添加-n
。