这是我的脚本test.sh
if ssh myhost true; then
echo 1
fi
echo 2
ps我为myhost设置了ssh密钥,因此它不会询问密码。
如果我通过bash运行它,它将输出两行
$ bash test.sh
1
2
但是,如果我将脚本重定向到bash的stdin,它只会输出一行
$ bash < test.sh
1
为什么bash表现不同?这是bash的错误还是魔术功能?
我已经尝试过bash 4.3和4.4。
ps如果替换ssh myhost true
为true
,脚本将始终输出两行。
简短的答案:让bash从文件中读取命令与让bash从文件中获取所有输入之间存在重要区别。
ssh
倾向于从标准输入中读取所有可用输入,然后通过连接将其发送到远程计算机。当您运行时bash test.sh
,shell从test.sh读取命令,但是标准输入仍然是您的终端。ssh会将您输入的任何内容发送到true
命令(它将忽略该命令)。当您运行时bash < test.sh
,会将标准输入设置为脚本,因此bash及其运行的命令都将从中读取。bash读取该if
块,然后执行它;ssh读取脚本的其余部分(echo 2
命令),并将其发送到remote true
,后者将忽略它。然后bash发现它在输入的末尾,因此退出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句