스크립트가 파이프될 때 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

그렇지 않으면 후속 행이 명령에 입력됩니다.

관련 정보