tee 命令是如何工作的?
在遇到大約 3 個
tee
我認為不具指導性的解釋後,我會要求對這個命令進行簡單、通用和逐步(如果可能)的解釋,針對 Linux 新手。我確實了解我們通過管道、命令的標準輸出或直接使用某個文件來使用它,但我想我想念該命令對這些內容的實際作用以及它何時有用。
所以這就是我的要求,希望找到一個說教的解釋,以一種清晰、有步驟的方式為新人服務:
- 該命令如何與命令的標準輸出或文件本身一起使用?
- 為什麼常說
tee
讀取標準輸入?我的意思是,如果我這樣做ls -l
,tee
則不會讀取語法ls -l
本身,而是讀取它列印到會話中的標準輸出。另外,如果你願意,請分享你日常工作中的一個實際例子,什麼時候
tee
對你很有用?
從
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
僅提示我們在終端中的程序位置。另請參閱此處帶有tee標籤的其他問題。