为什么 bash 对脚本和 stdin 的行为不同?

为什么 bash 对脚本和 stdin 的行为不同?

这是我的脚本,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 发现它位于输入的末尾,因此退出。

相关内容