"리디렉션"및 "파이프"로 실제로 진행되는 작업에 대해 생각하면 사물을 시각화하는 것이 훨씬 쉽습니다. bash의 경로 재 지정 및 파이프는 한 가지 작업을 수행합니다. 프로세스 파일 디스크립터 0, 1 및 2가 가리키는 위치를 수정하십시오 (/ proc / [pid] / fd / * 참조).
때 파이프 또는 "|" bash는 fifo를 생성하고 왼쪽 명령의 FD 1을이 fifo로 가리키고 오른쪽 명령의 FD 0을 동일한 fifo로 가리 킵니다.
다음으로 각 측면의 리디렉션 연산자 가 왼쪽에서 오른쪽으로 평가 되고 설명자 복제가 발생할 때마다 현재 설정이 사용됩니다. 파이프가 먼저 설정 되었기 때문에 FD1 (왼쪽)과 FD0 (오른쪽)이 이미 원래 있던 것에서 이미 변경되었으므로 이러한 중복이 해당 사실을 반영하기 때문에 중요합니다.
따라서 다음과 같은 내용을 입력하면
command 2>&1 >/dev/null | grep 'something'
다음은 순서대로 수행됩니다.
- 파이프 (fifo)가 생성됩니다. "명령 FD1"이이 파이프를 가리 킵니다. "grep FD0"도이 파이프를 가리 킵니다
- "명령 FD2"는 "명령 FD1"이 현재 가리키는 곳 (파이프)을 가리 킵니다.
- "명령 FD1"은 / dev / null을 가리 킵니다.
따라서 "command"가 FD 2 (stderr)에 쓰는 모든 출력은 파이프로 향하고 반대쪽의 "grep"에 의해 읽 힙니다. "command"가 FD 1 (stdout)에 쓰는 모든 출력은 / dev / null로 이동합니다.
대신 다음을 실행하십시오.
command >/dev/null 2>&1 | grep 'something'
다음과 같은 일이 발생합니다.
- 파이프가 작성되고 "명령 FD 1"및 "grep FD 0"이 지시됩니다.
- "명령 FD 1"은 / dev / null을 가리 킵니다.
- "명령 FD 2"는 FD 1이 현재 가리키는 위치를 가리 킵니다 (/ dev / null)
따라서 "command"의 모든 stdout 및 stderr은 / dev / null로 이동합니다. 파이프에 아무것도 들어 가지 않으므로 화면에 아무 것도 표시하지 않고 "grep"이 닫힙니다.
또한 리디렉션 (파일 설명자)은 읽기 전용 (<), 쓰기 전용 (>) 또는 읽기 / 쓰기 (<>) 일 수 있습니다.
마지막 메모. 프로그램이 FD1 또는 FD2에 무언가를 쓰는지 여부는 전적으로 프로그래머에게 달려 있습니다. 좋은 프로그래밍 방법은 오류 메시지가 FD 2로 가고 일반 출력이 FD 1로 가도록 지시하지만, 둘을 혼합하거나 규칙을 무시하는 조잡한 프로그래밍을 종종 보게 될 것입니다.