agc Asked: 2017-11-23 07:54:42 +0800 CST2017-11-23 07:54:42 +0800 CST 2017-11-23 07:54:42 +0800 CST `tee` 和 `bash` 进程替换顺序 772 我本以为这段代码会首先打印“ oof ”: echo foo | tee >(rev) | ( sleep 1 ; cat ; ) 输出: foo oof 增加sleep时间不会改变顺序。为什么那行不通? 请注意,其他工具确实可以按预期工作,例如: echo foo | pee rev 'sleep 1 ; cat'。 bash pipe 2 个回答 Voted Best Answer Stéphane Chazelas 2017-11-23T08:21:24+08:002017-11-23T08:21:24+08:00 在 echo foo | tee >(rev) | (sleep 1; cat) 在bash与 in 类似ksh,但与 不同的是,alsozsh的标准输出rev是指向 的管道(sleep 1; cat)。 echo, tee,rev和(...)subshell 同时启动,但是在管道 to之前tee写入foo\nstdout ,所以无论如何,都会在 writes 之后写入管道,所以只能在最后。延迟没有发生。revrevoofteefoooofcat 如果您希望输出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))。 agc 2018-02-12T20:15:04+08:002018-02-12T20:15:04+08:00 似乎使用两个bash进程替换(而不是一个,然后是一个管道)按预期工作: echo foo | tee >(rev) >( sleep 1 ; cat ; ) > /dev/null ; sleep 1 输出: oof foo 注意第二个 sleep防止“ foo ”在命令提示符后打印。
在
在
bash
与 in 类似ksh
,但与 不同的是,alsozsh
的标准输出rev
是指向 的管道(sleep 1; cat)
。echo
,tee
,rev
和(...)
subshell 同时启动,但是在管道 to之前tee
写入foo\n
stdout ,所以无论如何,都会在 writes 之后写入管道,所以只能在最后。延迟没有发生。rev
rev
oof
tee
foo
oof
cat
如果您希望输出
rev
不通过管道到(sleep 1; cat)
,您可以使用zsh
或执行以下操作:请注意,其功能中
zsh
也有一个内置功能,因此您可以执行以下操作:tee
multios
然而在:
的输出
rev
会通过cat
(令人困惑的是,在这种情况下不会echo foo >(echo bar) | (sleep 1; cat)
)。似乎使用两个
bash
进程替换(而不是一个,然后是一个管道)按预期工作:输出:
注意第二个
sleep
防止“ foo ”在命令提示符后打印。