나는 이 코드가 "동전"첫 번째:
echo foo | tee >(rev) | ( sleep 1 ; cat ; )
산출:
foo
oof
시간을 늘려도 sleep
순서는 바뀌지 않습니다. 왜 작동하지 않습니까?
다른 도구에 주의하세요하다예상대로 작동하고,예를 들어: echo foo | pee rev 'sleep 1 ; cat'
.
답변1
존재하다
echo foo | tee >(rev) | (sleep 1; cat)
bash
in 과 비슷 ksh
하지만 zsh
stdout rev
도 에 대한 파이프라는 점에서 다릅니다 (sleep 1; cat)
.
echo
, tee
및 하위 쉘이 동시에 시작되지만 stdout 에 기록됩니다 rev
.(...)
tee
foo\n
앞으로Pipe to rev
이므로 무슨 일이 있어도 파이프는 rev
writes 이후에 작성되므로 oof
맨 마지막에만 배치할 수 있습니다. 지연이 발생하지 않습니다.tee
foo
oof
cat
출력을 원하시면rev
아니요파이프를 통해 도달하려면 다음을 (sleep 1; cat)
사용하거나 수행할 수 있습니다 zsh
.
{ echo foo 3>&- | tee >(rev >&3 3>&-) 3>&- | (sleep 1; cat) 3>&-; } 3>&1
해당 기능에는 zsh
다음을 수행할 수 있는 기능도 내장되어 있습니다.tee
multios
echo foo > >(rev) > >(sleep 1; cat)
그러나:
echo foo > >(rev) | (sleep 1; cat)
의 출력이 rev
통과됩니다 cat
(혼란스럽게도 이 경우에는 통과하지 않습니다 echo foo >(echo bar) | (sleep 1; cat)
).
답변2
bash
하나의 프로세스와 파이프 대신 두 개의 프로세스로 교체한 다음 STDOUT을 /dev/null에 덤프하면 예상대로 작동합니다.
echo foo | tee >(rev) >( sleep 1 ; cat ; ) > /dev/null ; sleep 1
산출:
oof
foo
노트:
- 이것2위
sleep
예방하다"부자" 명령 프롬프트 다음에 인쇄됩니다. - 지연 숫자를
sleep
최적의 값으로 줄이는 것이 더 좋지만 그 숫자가 얼마인지 잘 모르겠습니다.1
약간 느리지만 항상 작동하는 것 같습니다..01
항상 작동하는 것은 아니지만(즉, 출력이 때때로 잘못된 순서로 표시됨).1
꽤 잘 작동하는 것 같습니다.