2 개의 tmp 파일이있는 한 줄 (원하는 것이 아님)은 다음과 같습니다.
foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt
bash 사용하면 다음을 시도 할 수 있습니다.
diff <(foo | bar) <(baz | quux)
foo | bar | diff - <(baz | quux) # or only use process substitution once
제 2 버전은 더 명확하게 보여줌으로써, 어떤을이었다 입력 당신을 생각 나게 할 것이다
-- /dev/stdin
대 ++ /dev/fd/63
대신에 두 개의 번호 FDS의, 또는 무언가를.
명명 된 파이프조차도 적어도 bash가 파일 이름을 사용하여 프로세스 대체를 구현할 수있는 OS에서 bash가 /dev/fd/63
설정 한 이미 열려있는 파일 설명자에서 명령을 열고 읽을 수있는 파일 이름을 얻는 것과 같은 파일 시스템에 나타나지 않습니다. 명령을 실행하기 전에 (즉, bash는 pipe(2)
fork 이전에 사용 하고 fd 63 dup2
에서에 대한 출력을 quux
입력 파일 설명 diff
자로 리디렉션합니다 .)
"매직" /dev/fd
또는 시스템이없는 시스템 /proc/self/fd
에서 bash는 명명 된 파이프를 사용하여 프로세스 대체를 구현할 수 있지만 임시 파일과 달리 적어도 자체적으로 관리해야하며 데이터는 파일 시스템에 기록되지 않습니다.
bash가 프로세스 대체를 구현 echo <(true)
하여 파일 이름을 읽지 않고 인쇄하는 방법을 확인할 수 있습니다 . /dev/fd/63
일반적인 Linux 시스템에서 인쇄 합니다. 또는 bash가 사용하는 시스템 호출에 대한 자세한 내용은 Linux 시스템에서이 명령이 파일 및 파일 설명자 시스템 호출을 추적합니다.
strace -f -efile,desc,clone,execve bash -c '/bin/true | diff -u - <(/bin/true)'
bash가 없으면 명명 된 파이프를 만들 수 있습니다. STDIN에서 하나의 입력을 읽고 다른 이름으로 명명 된 파이프를 사용 -
하도록 지시하는 데 사용하십시오 diff
.
mkfifo file1_pipe.txt
foo|bar > file1_pipe.txt && baz | quux | diff file1_pipe.txt - && rm file1_pipe.txt
참고로 할 수 있습니다 만 파이프를 하나 개의 출력 에 여러 개의 입력 티 명령 :
ls *.txt | tee /dev/tty txtlist.txt
위의 명령은 ls * .txt의 출력을 터미널에 표시하고 텍스트 파일 txtlist.txt에 출력합니다.
그러나 프로세스 대체를 사용 tee
하면 동일한 데이터를 여러 파이프 라인에 공급할 수 있습니다 .
cat *.txt | tee >(foo | bar > result1.txt) >(baz | quux > result2.txt) | foobar
mkfifo a; cmd >a& cmd2|diff a -; rm a