하나의 명령에 두 개의 파이프


9

다음 구문에 약간 혼란 스럽습니다. 작동하지만 왜 작동하는지 이해하지 못합니다. diff 명령에 두 개의 파이프가 연결된 것처럼 보입니다. 그러나 하나만 있지 STDIN않습니까?

예 :

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

다음 은 매뉴얼 페이지 에서 관련 주제 ( 프로세스 대체)에 대한 링크 bash입니다.
chepner

답변:


13

파이프는 단순히 0 (stdin)과 다른 파일 디스크립터에 바인드됩니다.

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

물론 프로세스는 한 번에 둘 이상의 열린 파일 설명자를 가질 수 있으므로 문제가 없습니다.


임시 파이프 라고만 알았다면 구글에서 할 수 있었을 것입니다. 감사합니다!

@ iblue : 나는 그것이 "임시 파이프"라고 생각하지 않습니다. pipe()시스템 호출에 의해 생성 된 파이프 일뿐 입니다.
Sven Marnach

정확히 말하면, "익명 명명 된 파이프"라고 할 수 있지만 구글로 충분합니다.

2
@WilliamPursell : 관련된 파일이 없습니다. 쉘은 pipe()서브 프로세스를 사용하여 익명 파이프를 작성하고 분기합니다. 주요 과정은 수행 익명 파이프를 사용하는 경우 추가 파일 기술자를 열 수 있습니다. 이러한 추가 파일 디스크립터는 형식으로 전달되며 /dev/fd/...프로세스는 일반적으로 이러한 파일 이름을 사용하여 파일 디스크립터 를 열기 만합니다. 이로 인해 dup()더 많은 파일 디스크립터가 생성됩니다. 프로세스는 또한 공개 호출없이 명명 된 파일 디스크립터를 즉시 사용할 수 있습니다.
Sven Marnach

1
...이 작고 어리석은 테스트 프로그램 에서 보여준 것처럼 . 로 컴파일 한 후로 a호출했으며 ./a <(ls)파일 목록을 성공적으로 인쇄하여 명명 된 파일 디 립터 (내 경우에는 63)가 이미 열려 있음을 증명합니다. bash는 Linux와 다른 아키텍처의 임시 디렉토리에서 명명 된 파이프를 사용할 수 있으며,이 경우 기본 프로세스를 시작할 때 추가 파일 디스크립터가 열리지 않습니다.
Sven Marnach 2012
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.