当脚本通过管道传输时,为什么 bash 输出数据而不是执行?

当脚本通过管道传输时,为什么 bash 输出数据而不是执行?

我在 Ubuntu 14.04 上运行以下脚本:

#!/bin/bash

apt-get purge -y nginx
apt-get install -y nginx

date

当我像这样运行它时cat /tmp/script | bash,apt-get开始安装,然后打印“日期”(不是实际日期,而是命令名称),然后打印剩余的apt-get输出。

但是,如果我像这样运行脚本/tmp/script,它会按预期工作:在 apt-get 完成后打印日期。

为什么会发生这种情况?如何强制 bash 在通过管道传输时以与直接调用时相同的方式工作?

答案1

您必须关闭(或以其他方式重定向)各个命令的标准输入:

#!/bin/bash

apt-get purge -y nginx <&-
apt-get install -y nginx <&-

date

否则后续行将被输入到命令中。

相关内容