这是我的脚本,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
,脚本将始终输出两行。
答案1
简短回答:bash 从文件读取命令和 bash 执行命令之间存在重要区别全部来自文件输入。
ssh
倾向于从标准输入读取所有可用的输入,并通过连接将其发送到远程计算机。当您运行 时bash test.sh
,shell 从 test.sh 读取命令,但标准输入仍然是您的终端;ssh 会将您之前输入的任何内容发送给命令true
(命令将忽略它)。当您运行 时bash < test.sh
,标准输入设置为脚本,因此 bash 和它运行的命令都从中读取。bash 读取块if
,然后执行它;ssh 读取脚本的其余部分(命令echo 2
),并将其发送到远程true
,远程 会忽略它。然后 bash 发现它位于输入的末尾,因此退出。