여러 표준 입력? 어떻게? 따르면 표준 입력은 하나의 스트림이라고

commandlinefu 게시물에서 :

$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)

여러 표준 입력처럼 보이지만 Linux Porgramming 과정을 올바르게 기억한다면 그렇게 할 수 없습니다. 정의에 따르면 표준 입력은 하나의 스트림이라고 생각했습니다.

아마도 이것은 stdin과 관련이 있습니까? 누군가 나에게 이것을 설명 할 수 있습니까? 문서에 대한 링크를 제공 할 수도 있습니다.

보너스 : 스크립트는 이러한 여러 스트림을 어떻게 처리합니까? 누군가 파이썬이나 펄 예제를 제공 할 수 있다면 매우 도움이 될 것입니다.



답변

이것은 다중 표준 입력이 아닙니다. 이것은 ‘프로세스 대체’라는 bash’ism입니다.
http://tldp.org/LDP/abs/html/process-sub.html

/dev/fd/something대체 할 때마다 의사 파일 ( )을 만듭니다 . 꽤 유용합니다. 이 명령은 스트림으로 만 읽을 수 있으므로 fseek를 사용하여 앞뒤로 이동할 수 없습니다. 파이프처럼 바이트 스트림으로 읽어야합니다.

보너스 답변

이것을 사용하기 위해 너무 많은 일을 할 필요는 없습니다. 스크립트와 관련하여 명령 줄에 유효한 파일 이름을 얻습니다.이 파일은 다른 것과 같이 open () 될 수 있습니다. 다른 사람들이 말했듯이 diff /dev/fd/XX /dev/fd/YY. 이러한 의사 파일 중 하나에서 stat ()를 수행하면 이름이 지정된 파이프임을 알 수 있으며 파이프 시맨틱으로 처리해야합니다. 즉, fseek () 또는 ftell ()이 없습니다. 당신이 파일 (예를 들어, 만약 명시 적으로 확인하기 위해 합계 () 테스트를 할 경우 [ -f $1 ]이)가 됩니다 휴식 -이 결국 명명 된 파이프로 구현됩니다.


답변

<(...)수행 과정 대체를 bash는. Parens의 프로세스 출력은 일반 3 이상의 추가 파일 디스크립터로 전송되고 해당 파일 디스크립터에 해당하는 파일 이름이 리턴됩니다. 이런 식으로 명령의 출력은 파일 이름으로 취급되어 다른 명령에 전달 될 수 있습니다.


답변

각 프로세스마다 하나 stdin와 하나 stdout 가 있습니다 . 일반적으로 터미널에 연결되지만 서로 별도로 리디렉션 될 수 있습니다.

이 예에서는 두가 wget자신을 얻을 각각의 관련 프로세스 stdinstdout. 각 wget과정에 기록 -의 인 stdout. 그런 다음 bash프로세스 대체 <(...)stdout프로세스를 프로세스를 고유 한 의사 파일에 연결하여 diff읽을 수 있는 고유 한 의사 파일에 연결합니다 . 참고 두 개의 프로세스 치환은 두 개의 서로 다른 가상 파일을 얻을! 따라서 diff다음과 같은 내용이 표시됩니다.

diff /dev/fd/XX /dev/fd/YY

여기서 stdoutwget -q -O - URL1접속되고 /dev/fd/XX, 상기 stdoutwget -q -O - URL2/dev/fd/YY.