Linux 管理的一個最重要並且有趣的話題是 I/O 重定向。此功能在命令列中使你能夠將命令的輸入輸出取自或送到檔案中,或者可以使用管道將多個命令連線在一起以形成所謂的 “命令管道” 。
我們執行的所有命令基本上產生兩種輸出:
命令結果 – 程式產生的資料,以及
程式狀態和錯誤訊息,用來通知使用者程式的執行細節。
在 Linux 和其他類 Unix 系統中,有三個預設檔案(名稱如下),這些檔案也由 shell 使用檔案描述符號標識:
stdin 或 0 – 它連線鍵盤,大多數程式從此檔案讀取輸入。
stdout 或 1 – 它連線螢幕,並且所有程式將其結果傳送到此檔案
stderr 或 2 – 程式將狀態/錯誤訊息傳送到此檔案,它也連線到螢幕上。
因此,I/O 重定向允許你更改命令的輸入源以及將輸出和錯誤訊息傳送到其他地方。這可以通過 < 和 > 重定向操作符來實現。
如何在 Linux 中重定向標準輸出到檔案中
如下面的示例所示,你可以重定向標準輸出,這裏,我們要儲存 top 命令的輸出以供以後檢查:
$ top -bn 5 >top.log
其中標誌的含義:
-b – 讓 top 以批處理模式執行,以便你可以將其輸出重定向到一個檔案或另一個命令。
-n – 指定命令終止前的迭代次數。
你可以使用 cat 命令來檢視 top.log 檔案的內容:
$ cat top.log
要將命令輸出附加在檔案後面,請使用 >> 操作符。
例如,要將 top 命令的輸出追加在上面的 top.log 檔案中,特別是在指令碼(或命令列)中,請輸入下面的那行:
$ top -bn 5 >>top.log
注意: 也可以使用檔案描述符數字,上面的重定向命令等同於:
$ top -bn 5 1>top.log
如何在 Linux 中重定向標準錯誤到檔案中
要重定向命令的標準錯誤,你需要明確指定檔案描述符 2,以便讓 shell 瞭解你正在嘗試做什麼。
例如,下面的 ls 命令將在沒有 root 許可權的普通系統使用者執行時產生錯誤:
$ ls -l /root/
你可以重定向標準錯誤到檔案中:
$ ls -l /root/ 2>ls-error.log
$ cat ls-error.log
重定向標準錯誤到檔案中
為了將標準錯誤附加在檔案後,使用下面的命令:
$ ls -l /root/ 2>>ls-error.log
如何重定向標準輸出及標準錯誤到一個檔案中
還可以將命令的所有輸出(包括標準輸出和標準錯誤)捕獲到單個檔案中。這可以用兩種可能的方式,通過指定檔案描述符來完成:
1 、 第一種是相對較舊的方法,其工作方式如下:
$ ls -l /root/ >ls-error.log 2>&1
上面的命令意思是 shell 首先將 ls 命令的輸出傳送到檔案 ls-error.log(使用 >ls-error.log),然後將所有寫到檔案描述符 2(標準錯誤)的錯誤訊息重定向到檔案 ls-error.log(使用2>&1)中。(LCTT 譯註:此處原文有誤,徑改。)這表示標準錯誤也被髮送到與標準輸出相同的檔案中。
2 、 第二種並且更直接的方法是:
$ ls -l /root/ &>ls-error.log
你也可以這樣將標準輸出和標準錯誤附加到單個檔案後:
$ ls -l /root/ &>>ls-error.log
如何將標準輸入重定向到檔案中
大多數(如果不是全部)命令從標準輸入獲得其輸入,並且標準輸入預設連線到鍵盤。
要從鍵盤以外的檔案重定向標準輸入,請使用 < 操作符,如下所示:
$ cat
如何使用管道進行 I/O 重定向
要將一個命令的輸出重定向為另一個命令的輸入,你可以使用管道,這是用於構建複雜操作命令的有力方法。
例如,以下命令將列出最近修改的前五個檔案。
$ ls -lt | head -n 5
選項的意思是:
-l – 啓用長列表格式
-t – 最新修改的檔案首先顯示
-n – 指定要顯示的標題行數
構建管道的重要命令
在這裏,我們將簡要回顧一下構建命令管道的兩個重要命令,它們是:
xargs 用於從標準輸入構建和執行命令列。下面是使用 xargs 的管道示例,此命令用於將檔案複製到 Linux 中的多個目錄:
$ echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh
複製檔案到多個目錄
選項含義:
-n 1 – 讓 xargs 對每個命令列最多使用一個引數,並傳送到 cp 命令
cp – 複製檔案
-v – 顯示 cp 命令的進度。
有關更多的使用選項和資訊,請閲讀 xargs 手冊頁:
$ man xargs
tee 命令從標準輸入讀取,並寫入到標準輸出和檔案中。我們可以演示 tee 如何工作:
$ echo “Testing how tee command works” | tee file1
tee 命令示例
檔案或文字過濾器通常與管道一起用於有效地操作 Linux 檔案,來以強大的方式來處理資訊,例如命令的重組輸出(這對於生成有用的 Linux 報告是必不可少的)、修改檔案中的文字和其他的 Linux 系統管理任務。