我在 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
否则后续行将被输入到命令中。