跳轉到內容

Ict-創新/LPI/103.4

來自華夏公益教科書

103.4 流、管道和重定向

[編輯 | 編輯原始碼]

考生應該能夠重定向流並將它們連線起來,以便有效地處理文字資料。任務包括重定向標準輸入、標準輸出和標準錯誤,將一個命令的輸出管道到另一個命令的輸入,使用一個命令的輸出作為另一個命令的引數,並將輸出傳送到標準輸出和檔案。


關鍵知識領域

  • 重定向標準輸入、標準輸出和標準錯誤。
  • 將一個命令的輸出管道到另一個命令的輸入。
  • 將一個命令的輸出作為另一個命令的引數。
  • 將輸出傳送到標準輸出和檔案。

輸入、輸出、重定向

[編輯 | 編輯原始碼]

UNIX 程序使用流來獲取輸入(標準輸入流)、傳送輸出(標準輸出流)以及傳送錯誤訊息的流(標準錯誤流)。這些流可以被任何程序重定向。在大多數情況下,標準輸入(stdin)是鍵盤,而兩個輸出描述符,標準輸出(stdout)和標準錯誤(stderr),都發送到螢幕。有時,將這些標準流重定向以便程序從檔案中接收輸入和/或將輸出傳送到檔案會很方便。

stdin、stderr 和 stdout 的數值
stdin 0
stdout 1
stderr 2

在重定向或與這些流互動時,我們用它們的數值來引用它們。

標準輸出重定向

例如,要將標準輸出從螢幕重定向到檔案,您將使用“>”符號。

例如

$ find / -iname *.txt > textfiles.txt

這將執行find 實用程式並將結果輸出到 textfiles.txt 檔案。螢幕上沒有輸出可見。如果 textfiles.txt 檔案不存在,則會先建立它,否則會覆蓋它。要追加到檔案而不是建立新檔案,可以使用“>>”運算子。


標準錯誤重定向

標準錯誤重定向使用與標準輸入重定向相同的格式,但您需要指定要重定向的是 stderr 流而不是 stdout。這可以透過將 stderr 流 ID 放在重定向符號之前來完成。

$ myapp 2> error.txt

與上面的 stdout 示例一樣,這將建立一個新檔案。要追加到現有檔案,您將使用“2>>”重定向標準錯誤。

重定向 stdout 和 stderr

要同時重定向 stdout 和 stderr,您將使用“&>”或“&>>”運算子。這將把標準輸出和標準錯誤都定向到同一個檔案。

標準輸入重定向

要讓程序從檔案中讀取輸入而不是從鍵盤獲取輸入,您將使用“<' 符號,如下例所示

$ mysql -u root -p < createtable.sql

在這裡,mysql 命令列介面被告知從名為 createtable.sql 的檔案中獲取其標準輸入,而不是從鍵盤讀取輸入。此檔案將包含用於建立表的 SQL 語句,例如。

管道命令

[編輯 | 編輯原始碼]

管道命令用於將一個程序的標準輸出重定向到另一個程序的標準輸入。


program1 | program2

管道由“|”符號表示。資料流從左到右。下圖說明了如何將一個程序的 stdout 重定向到另一個程序的 stdin。

# ls-l | less

tee 命令

command | tee FILENAME

此命令在管道之後使用,並以檔名作為引數。來自之前命令的標準輸出將被髮送到作為引數給定的檔案,但tee 也允許流透過到stdoutstdout 已經透過這種方式被複制。

xargs

此工具通常被認為是find 的配套工具。事實上,xargs 會將標準輸出的每一行作為另一個工具的引數 進行處理。我們可以使用xargs 來刪除屬於某個使用者的所有檔案,方法如下:

$ find / -type f -user 502 | xargs rm –f

如果檔名列表很長,xargs 將將其拆分為多個部分,並多次呼叫 rm 命令,每個部分一個。如果引數列表過長而無法處理,這有時很有用。

$ ls |xargs rm -f



使用過的檔案、術語和實用程式

  • tee
  • xargs


上一章 | 下一章

華夏公益教科書