Bash
tee
和 bash
程序替換順序
我本以為這段程式碼會首先列印“ oof ”:
echo foo | tee >(rev) | ( sleep 1 ; cat ; )
輸出:
foo oof
增加
sleep
時間不會改變順序。為什麼那行不通?請注意,其他工具確實可以按預期工作,例如:
echo foo | pee rev 'sleep 1 ; cat'
。
在
echo foo | tee >(rev) | (sleep 1; cat)
在
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
或執行以下操作:{ 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)
)。