Bash

teebash 程序替換順序

  • February 12, 2018

我本以為這段程式碼會首先列印“ 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(...)subshel​​l 同時啟動,但是在管道 to之前tee寫入foo\nstdout ,所以無論如何,都會在 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))。

引用自:https://unix.stackexchange.com/questions/406334