나는 이 코드가 "돈" 첫 번째:
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 bash
과 ksh
같지만 zsh
의 표준 출력 rev
은 에 대한 파이프입니다 (sleep 1; cat)
.
echo
, tee
및 rev
하위 (...)
쉘이 동시에 시작되지만 stdout에 tee
씁니다 .foo\n
~ 전에에 대한 파이프는 rev
어떤 경우든 writes 후에 파이프에 rev
쓸 것이므로 마지막 에만 올 수 있습니다. 지연은 발생하지 않습니다.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
잘 작동하는 것 같습니다.