다음 두 가지 예에서는 어떤 일이 발생합니까? 각 파이프라인에서 두 번째 명령만 실행되는 이유는 무엇입니까? 여기서 파이프라인은 어떻게 작동하나요?
실시예 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
파일의 내용이 파이프의 왼쪽에서 실행되어 명령 입력으로 파이프됩니다.date
cat
이 date
명령은 표준 입력 스트림에 관심이 없으며 거기에 도착하는 모든 데이터를 무시합니다. 그러나 표준 출력 스트림에 있는 자체 출력을 생성합니다.
인터넷보이는결과적으로 의 출력은 cat
무시되고 폐기되는 반면, 의 출력은 date
터미널(또는 파이프된 출력이 가는 곳)에 표시됩니다.
명령의 출력에서 실제로 일어나는 일은 명령이 읽혀지지 않기 때문에 출력이 읽힐 때까지 기다리면서 명령이 일시적으로 차단된다는 것 cat
입니다 (파이프 버퍼가 보유할 수 있는 만큼 성공적으로 출력한 후; 언제 읽힐지 알 수 없습니다). 읽어보세요) ). 명령 은 작업을 수행하고 문자열을 출력한 다음 종료됩니다.date
cat
date
date
이 시점에서 명령은 date
종료되고 표준 입력 스트림이 닫힐 때 쉘로부터 신호를 받습니다 . 이 신호는 표준 출력에 쓰려고 시도하는 모든 데이터가 결코 읽히지 않으며 종료된다는 것을 나타냅니다(종료는 이 신호의 기본 동작입니다). 읽고 있는 파일의 나머지 부분은 절대 읽히지 않으며, 파이프 버퍼의 데이터는 쉘이 연관된 메모리를 해제할 때 삭제됩니다.date
cat
PIPE
cat
PIPE
cat
date
w
표준 입력 스트림을 읽지 않는 대체 명령이나 다른 명령에서도 똑같은 일이 발생합니다.
실제 사용된 명령어와 비교할 수 있습니다.하다표준 입력 스트림을 읽으십시오.
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