`tee` 및 `bash` 프로세스 교체 순서

`tee` 및 `bash` 프로세스 교체 순서

나는 이 코드가 "동전"첫 번째:

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)

bashin 과 비슷 ksh하지만 zshstdout rev도 에 대한 파이프라는 점에서 다릅니다 (sleep 1; cat).

echo, tee및 하위 쉘이 동시에 시작되지만 stdout 에 기록됩니다 rev.(...)teefoo\n앞으로Pipe to rev이므로 무슨 일이 있어도 파이프는 revwrites 이후에 작성되므로 oof맨 마지막에만 배치할 수 있습니다. 지연이 발생하지 않습니다.teefoooofcat

출력을 원하시면rev 아니요파이프를 통해 도달하려면 다음을 (sleep 1; cat)사용하거나 수행할 수 있습니다 zsh.

{ echo foo 3>&- | tee >(rev >&3 3>&-) 3>&- | (sleep 1; cat) 3>&-; } 3>&1

해당 기능에는 zsh다음을 수행할 수 있는 기능도 내장되어 있습니다.teemultios

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꽤 잘 작동하는 것 같습니다.

관련 정보