agc*_*agc 3 bash pipe process-substitution tee
我原以为这段代码会先打印“ oof ”:
echo foo | tee >(rev) | ( sleep 1 ; cat ; )
Run Code Online (Sandbox Code Playgroud)
输出:
foo
oof
Run Code Online (Sandbox Code Playgroud)
增加sleep时间不会改变顺序。为什么这不起作用?
请注意,其他工具确实按预期工作,例如: echo foo | pee rev 'sleep 1 ; cat'。
在
echo foo | tee >(rev) | (sleep 1; cat)
Run Code Online (Sandbox Code Playgroud)
在bashlike in ksh,但不同的是zsh,stdout ofrev也是到的管道(sleep 1; cat)。
echo, tee,rev和(...)subshell 是同时启动的,但是在管道之前tee写入foo\nstdout到,所以无论如何,都会在writes之后写入管道,所以只能到最后。延迟没有发生。revrevoofteefoooofcat
如果您希望rev 不通过管道输出到(sleep 1; cat),您可以使用zsh或执行以下操作:
{ echo foo 3>&- | tee >(rev >&3 3>&-) 3>&- | (sleep 1; cat) 3>&-; } 3>&1
Run Code Online (Sandbox Code Playgroud)
请注意,它的功能中zsh也有一个内置函数,因此您可以执行以下操作:teemultios
echo foo > >(rev) > >(sleep 1; cat)
Run Code Online (Sandbox Code Playgroud)
然而在:
echo foo > >(rev) | (sleep 1; cat)
Run Code Online (Sandbox Code Playgroud)
的输出rev会通过cat(令人困惑地考虑到它不是在这种echo foo >(echo bar) | (sleep 1; cat)情况下)。