파이프라인 실행 후에는 명령만 있습니다. 이러한 시나리오에서 파이프라인은 어떻게 작동합니까?

파이프라인 실행 후에는 명령만 있습니다. 이러한 시나리오에서 파이프라인은 어떻게 작동합니까?

다음 두 가지 예에서는 어떤 일이 발생합니까? 각 파이프라인에서 두 번째 명령만 실행되는 이유는 무엇입니까? 여기서 파이프라인은 어떻게 작동하나요?

실시예 1

$ cat /var/log/messages | date
Mon Apr  8 17:10:02 IST 2019

실시예 2

$ cat /var/log/messages | w
17:10:34 up 8 days,  1:24,  6 users,  load average: 0.63, 0.49, 0.61

답변1

두 예제의 두 명령은 모두 다음과 같습니다.처형된. 실제로는 파이프 기호 뒤의 명령 출력만 표시됩니다.

파이프에서는 /var/log/messages파일의 내용이 파이프의 왼쪽에서 실행되어 명령 입력으로 파이프됩니다.datecat

date명령은 표준 입력 스트림에 관심이 없으며 거기에 도착하는 모든 데이터를 무시합니다. 그러나 표준 출력 스트림에 있는 자체 출력을 생성합니다.

인터넷보이는결과적으로 의 출력은 cat무시되고 폐기되는 반면, 의 출력은 date터미널(또는 파이프된 출력이 가는 곳)에 표시됩니다.

명령의 출력에서 ​​실제로 일어나는 일은 명령이 읽혀지지 않기 때문에 출력이 읽힐 때까지 기다리면서 명령이 일시적으로 차단된다는 것 cat입니다 (파이프 버퍼가 보유할 수 있는 만큼 성공적으로 출력한 후; 언제 읽힐지 알 수 없습니다). 읽어보세요) ). 명령 은 작업을 수행하고 문자열을 출력한 다음 종료됩니다.datecatdatedate

이 시점에서 명령은 date종료되고 표준 입력 스트림이 닫힐 때 쉘로부터 신호를 받습니다 . 이 신호는 표준 출력에 쓰려고 시도하는 모든 데이터가 결코 읽히지 않으며 종료된다는 것을 나타냅니다(종료는 이 신호의 기본 동작입니다). 읽고 있는 파일의 나머지 부분은 절대 읽히지 않으며, 파이프 버퍼의 데이터는 쉘이 연관된 메모리를 해제할 때 삭제됩니다.datecatPIPEcatPIPEcat

datew표준 입력 스트림을 읽지 않는 대체 명령이나 다른 명령에서도 똑같은 일이 발생합니다.

실제 사용된 명령어와 비교할 수 있습니다.하다표준 입력 스트림을 읽으십시오.

cat /var/log/messages | tr '[:lower:]' '[:upper:]'

또는 파이프가 없는 경우( cat이러한 예에서는 파이프가 실제로 필요하지 않기 때문에)

tr '[:lower:]' '[:upper:]' </var/log/messages

답변2

파이프가 작동하는 방식은 다음과 같습니다. 왼쪽 명령의 출력이 오른쪽 명령의 입력으로 전송됩니다.

두 개의 명령을 차례로 실행하려면 세미콜론을 사용하십시오.

cat /var/log/messages ; date

첫 번째 명령이 성공한 경우에만 두 번째 명령을 실행하려면 다음을 사용하십시오 &&.

cat /var/log/messages && date

첫 번째 명령이 실패한 경우에만 두 번째 명령을 실행하려면 다음을 사용하십시오 ||.

cat /var/log/messages || date

백그라운드에서 첫 번째 명령을 실행하고 동시에 두 번째 명령을 실행하려면 다음을 사용하십시오.&

cat /var/log/messages & date

관련 정보