Bash

tee 到標準輸出和程序的最佳方式

  • October 2, 2019

我想做這樣的事情:

echo 'foo' | tee /dev/stdout > >(cat)

標準輸出從哪裡echo被發送到終端和 cat 程序。有沒有更簡單的方法來做到這一點?

當我執行這個:

echo 'foo' | tee >(echo 'bar')

出於某種原因,它不回顯“foo”它只回顯“bar”,為什麼?

您完全按照您展示的方式進行操作:

somecommand | tee >(othercommand)

的輸出somecommand將寫入othercommand到標準輸出的輸入和標準輸出。

您的echo 'bar'流程替換的問題在於它不關心來自teefrom的輸入echo 'foo',因此它只是bar盡可能快地輸出並終止。該tee實用程序然後嘗試寫入它,但失敗並因此PIPE在將字元串寫入標準輸出之前終止(從接收信號)。或者,tee可能有時間將數據寫入程序替換,在這種情況下,兩者都barfoo列印在標準輸出上,這不是確定性的。

您需要確保程序替換中的命令實際讀取發送給它的數據(否則,發送數據的意義何在?) 正如比利叔叔在評論中建議的那樣,這很容易在您的範例中通過讓流程替換只需使用cat >/dev/null(假設您對來自的數據不感興趣tee):

echo 'foo' | tee >(cat >/dev/null; echo 'bar')

或者

echo 'foo' | tee >(echo 'bar'; cat >/dev/null)

(這兩個變體只會在兩個字元串的最終輸出順序上有所不同)

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