
在遇到大約 3 個tee
我認為缺乏指導意義的解釋後,我會要求針對該命令提供一個簡單、通用和分步(如果可能的話)的解釋,針對 Linux 新手。
我確實知道我們可以透過管道、命令的標準輸出或直接在某個文件上使用它,但我想我錯過了該命令實際上對這些內容執行的操作以及何時它有用。
所以這就是我的要求,希望能找到一個說教性的解釋,以清晰、循序漸進的方式為新手服務:
該命令如何與命令的標準輸出或檔案本身一起使用?
為什麼通常說
tee
讀取標準輸入?我的意思是,如果我這樣做ls -l
,tee
不會讀取語法ls -l
本身,而是讀取它印到會話中的標準輸出。
另外,如果您願意,請分享一個您日常工作中的實際例子,什麼時候tee
對您非常有用?
答案1
從tee
我的系統上的手冊:
tee 實用程式將標準輸入複製到標準輸出,從而在零個或多個檔案中進行複製。輸出是無緩衝的。
因此,它從標準輸入讀取並將其複製到標準輸出,同時還將流複製到一個或多個檔案中。
在以下管道中,tee
將獲取管道中第一個命令的輸出並將其複製到標準輸出(終端),同時也在文件one
、two
和中複製它three
:
$ somecommand | tee one two three
tee
有許多用途,其中之一是結合sudo
將輸出重定向到 root 擁有的檔案:
$ somecommand | sudo tee /root/somefile >/dev/null
以下將不是自從重定向以非特權用戶身份發生以來一直有效(它也將以somecommand
root 身份運行,這可能是不需要的):
$ sudo somecommand >/root/somefile
一次將一組固定行附加到許多文件的人為示例(附加到所有用戶~/.profile
文件,假設*
擴展為用戶名並且擴展的命令行不會變得太長而導致 shell 無法處理):
$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH
使用的真實範例tee
:
time doas box-build.sh 2>&1 | tee build.out | grep '^=*>'
這是我建立的 OpenBSD 基礎系統。doas
是OpenBSD「等價」的sudo
是box-build.sh
一個小的 shell 腳本,用於建置(本質上cd /usr/src && make obj && make build
)。我想儲存整個建置流程的輸出,包括任何錯誤或警告,但我不想讓所有內容都湧入我的終端。為此,我使用tee
將所有內容保存到build.out
然後grep
僅獲取我們在終端中的進程中的位置的提示。
另請參閱此處標記為的其他問題球座標籤。