为什么bash停止处理脚本

时间:2012-01-20 09:59:51

标签: bash ssh

我正在生成这样的脚本

(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

1 个答案:

答案 0 :(得分:3)

ssh正在消耗stdin,在这种情况下是echo。添加-n

相关问题