현재 현상금 통지의 질문 :
일반적인 예는 너무 복잡합니다. 누군가 다음 예제를 구현하는 방법을 설명해 주시겠습니까?diff <(cat "$2" | xz -d) <(cat "$1" | xz -d)
여기 에 대답이있는 것 같습니다 .
Gilles의 답변 에서 볼 수 있듯이 일반적인 아이디어는 "프로듀서"명령의 출력을 파이프 라인의 여러 단계에서 새 장치 파일 1 로 보내서 "소비자"명령에 사용할 수있게하는 것입니다. 파일 이름은 인수로 사용할 수 있습니다. 시스템에서 파일 디스크립터에 대한 액세스 권한을)으로 가정합니다 /dev/fd/X
.
찾고있는 것을 달성하는 가장 간단한 방법은 다음과 같습니다.
xz -cd file1.xz | { xz -cd file2.xz | diff /dev/fd/3 -; } 3<&0
(사용 file1.xz
대신에 "$1"
가독성과 xz -cd
대신에 cat ... | xz -d
하나의 명령이 충분히 있기 때문에).
첫 번째 "생산자"명령의 출력은 xz -cd file1.xz
복합 명령 ( {...}
)으로 파이프됩니다 . 그러나 다음 명령의 표준 입력으로 즉시 소비되는 대신 파일 디스크립터에 복제 되어 3
복합 명령 내의 모든 항목에 액세스 할 수 있습니다 /dev/fd/3
. xz -cd file2.xz
표준 입력이나 파일 디스크립터에서 아무것도 사용하지 않는 두 번째 "producer"명령의 출력은 3
"consumer"명령으로 파이프되어 diff
표준 입력과에서 읽습니다 /dev/fd/3
.
필요한만큼 많은 "프로듀서"명령에 대한 장치 파일을 제공하기 위해 파이핑 및 파일 디스크립터 복제를 추가 할 수 있습니다. 예 :
xz -cd file1.xz | { xz -cd file2.xz | { diff /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
특정 질문과 관련이 없을 수도 있지만 다음 사항에 유의하십시오.
cmd1 <(cmd2) <(cmd3)
, cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
및 ( cmd2 | ( cmd3 | ( cmd1 /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
초기 실행 환경에 다른 잠재적 인 효과가있다.
에서 일어나는 것과는 달리 cmd1 <(cmd2) <(cmd3)
, cmd3
과 cmd1
에서는 cmd2 | { cmd3 | { cmd1 /dev/fd/3 /dev/fd/4; } 4<&0; } 3<&0
사용자로부터 어떤 입력을 읽을 수 없습니다. 추가 파일 설명자가 필요합니다. 예를 들어
diff <(echo foo) <(read var; echo "$var")
당신은 같은 것이 필요합니다
{ echo foo | { read var 0<&9; echo "$var" | diff /dev/fd/3 -; } 3<&0; } 9<&0
1 U & L에서 자세한 내용을 볼 수 있습니다 (예 : / dev 및 해당 하위 디렉토리 및 파일 이해) .