Bash

直接輸出到管道和標準輸出

  • November 2, 2021

有沒有辦法通過管道輸出命令並將其定向到該命令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兩次而不是1and 2tee輸出兩次到stdout,並且tee程序stdout被管道重定向到sed,所以所有這些輸出都會執行sed,你會在這裡看到 double 2

您必須使用其他文件描述符,例如標準錯誤/dev/stderr

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2

或用於tty獲取連接的偽終端:

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2

使用zshandmultios選項集,您根本不需要tee

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2

tee總是寫入其標準輸出。如果要將數據發送到除了標準輸出已經到達的終端之外的命令,只需使用該命令的程序替換即可。(請注意,儘管以 開頭>,程序替換不會重定向標準輸出,該tee命令將其視為參數。)

fortune | tee >(pbcopy)

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