Bash
直接輸出到管道和標準輸出
有沒有辦法通過管道輸出命令並將其定向到該命令
stdout
?例如,
fortune
列印一個幸運餅乾stdout
並將其傳遞給下一個命令:$ fortune | tee >(?stdout?) | pbcopy "...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and the Ugly)." (By Matt Welsh)
你的假設:
fortune | tee >(?stdout?) | pbcopy
將不起作用,因為
fortune
輸出將被寫入標準輸出兩次,因此您將輸出加倍到pbcopy
.在 OSX(和其他系統支持
/dev/std{out,err,in}
)中,您可以檢查它:$ echo 1 | tee /dev/stdout | sed 's/1/2/' 2 2
輸出
2
兩次而不是1
and2
。tee
輸出兩次到stdout
,並且tee
程序stdout
被管道重定向到sed
,所以所有這些輸出都會執行sed
,你會在這裡看到 double2
。您必須使用其他文件描述符,例如標準錯誤
/dev/stderr
:$ echo 1 | tee /dev/stderr | sed 's/1/2/' 1 2
或用於
tty
獲取連接的偽終端:$ echo 1 | tee "$(tty)" | sed 's/1/2/' 1 2
使用
zsh
andmultios
選項集,您根本不需要tee
:$ echo 1 >/dev/stderr | sed 's/1/2/' 1 2
tee
總是寫入其標準輸出。如果要將數據發送到除了標準輸出已經到達的終端之外的命令,只需使用該命令的程序替換即可。(請注意,儘管以 開頭>
,程序替換不會重定向標準輸出,該tee
命令將其視為參數。)fortune | tee >(pbcopy)