スクリプトがパイプされたときにbashが実行されるのではなくデータを出力するのはなぜですか?

スクリプトがパイプされたときにbashが実行されるのではなくデータを出力するのはなぜですか?

Ubuntu 14.04で次のスクリプトを実行しています。

#!/bin/bash

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

date

このように実行すると、cat /tmp/script | bashapt-getはインストールを開始し、「日付」(実際の日付ではなくコマンド名)を印刷し、残りのapt-get出力を印刷します。

しかし、このようにスクリプトを実行すると、期待/tmp/scriptどおりに機能します。 apt-getが完了すると、日付が印刷されます。

なぜこれが起こるのですか? bashを直接呼び出すときとパイプで接続するときに同じ方法で動作させるにはどうすればよいですか?

ベストアンサー1

個々のコマンドの標準入力を閉じるかリダイレクトする必要があります。

#!/bin/bash

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

date

それ以外の場合は、後続の行がコマンドに入力されます。

おすすめ記事