`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)

in bashksh같지만 zsh의 표준 출력 rev은 에 대한 파이프입니다 (sleep 1; cat).

echo, teerev하위 (...)쉘이 동시에 시작되지만 stdout에 tee씁니다 .foo\n~ 전에에 대한 파이프는 rev어떤 경우든 writes 후에 파이프에 rev쓸 것이므로 마지막 에만 올 수 있습니다. 지연은 발생하지 않습니다.oofteefoooofcat

출력을 원했다면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잘 작동하는 것 같습니다.

관련 정보