이 질문은 다음에서 비롯됩니다.https://mywiki.wooledge.org/ProcessSubstitution
mkfifo /var/tmp/fifo1
mkfifo /var/tmp/fifo2
sort list1 >/var/tmp/fifo1 &
sort list2 >/var/tmp/fifo2 &
diff /var/tmp/fifo1 /var/tmp/fifo2
rm /var/tmp/fifo1 /var/tmp/fifo2
명명된 파이프에 대해 내가 이해한 바에 따르면 다음이 작동한다고 생각합니다.
1-2행에서는 fifo1과 fifo2라는 두 개의 명명된 파이프를 만듭니다.
sort list1 > fifo1 &
명명된 파이프에 쓰기를 시도 하므로 sort list2 > fifo2 &
해당 파이프에서 데이터를 읽을 때까지 차단됩니다.
그런 다음 diff
fifo1 및 fifo2에서 다음 명령을 읽습니다. 따라서 3~4라인은 원활하게 실행됩니다. 다음으로 diff
실행하여 출력을 터미널로 보냅니다.
마지막으로 명명된 파이프 fifo1 및 fifo2를 삭제합니다.
소식통은 모든 것이 diff <(sort list1) <(sort list2)
.
내 설명이 맞나요?
감사해요!
답변1
내 설명이 맞나요?
습관. sort
s는 시작하기도 전에 차단됩니다( sort
s를 실행하는 서브쉘은 s를 실행하려고 할 때 차단됩니다).열려 있는먼저 들어간 것이 먼저 나온 것입니다). FIFO의 반대쪽이 차단될 때까지만 차단됩니다.열려 있는필요없어읽다그것에서 아무것도 얻지 마십시오.
시도하면 mkfifo /tmp/fifo; true > /tmp/fifo
fifo true
에 아무 것도 쓰려고 시도하지 않더라도 차단됩니다. 다른 쉘의 A는 true < /tmp/fifo
시도하지 않고 잠금을 해제합니다.읽다아무것.
소식통은 모든 것이
diff <(sort list1) <(sort list2)
.
그렇지 않습니다. 어떤 이유로 diff fifo1 fifo2
인수로 전달된 FIFO를 열기 전에 종료 되면 sort ... &
누군가가 자비를 베풀고 수동으로 죽일 때까지 영원히 거기에 머물게 됩니다.
명명된 파이프를 사용하여 프로세스 교체가 실제로 달성될 수 있는지는 모르겠지만 FWIW bash는 s가 없는 플랫폼에서는 이를 쉽게 구현하지 않습니다. /dev/fd
bash의 프로세스 교체는 버그가 있으므로 매우 주의해서 사용해야 합니다.