介紹
內建於 Linux 中的重新導向功能為您提供了一套強大的工具,可優化許多工作流程。軟體開發的 “Unix 哲學” 是製作每個都擅長一件事情的工具,這個哲學已被延續到現代命令列工具,這些工具在個別情況下非常強大,當結合在一起時更是如此。無論您是撰寫複雜的軟體還是只是在命令列上工作,瞭解如何操作環境中的不同 I/O 流將大大提高您的生產力。
先決條件
要跟隨本指南,您需要能夠訪問一台 Linux 伺服器。如果您需要有關首次連接伺服器的信息,可以參考我們的指南:使用 SSH 連接到 Linux 伺服器。
流
在 Linux 環境中,輸入和輸出分佈在三個流中。這些流是:
-
標準輸入(stdin)
-
標準輸出(stdout)
-
標準錯誤(stderr)
這些串流也被編號:
-
標準輸入(0)
-
標準輸出(1)
-
標準錯誤(2)
在用戶和終端之間的標準交互中,標準輸入來自用戶的鍵盤。標準輸出和標準錯誤顯示為文本在用戶的終端上。這三個串流合稱為標準串流。
標準輸入
標準輸入串流通常將數據從用戶傳輸給程序。期望標準輸入的程序通常從設備(例如鍵盤)接收輸入。在本教程的後面,您將看到將一個程序的輸出作為標準輸入傳遞給另一個程序的示例。
標準輸出
標準輸出是由程序生成的輸出。當標準輸出流沒有被重定向時,它將直接將文本輸出到終端。嘗試輸出一些任意文本,使用echo
:
OutputSent to the terminal
當沒有任何額外選項時,echo
命令會輸出在命令行上傳遞給它的任何參數。
不帶任何參數運行echo:
它將返回一個空行。一些程序如果沒有提供參數就不會執行任何操作。
標準錯誤
標準錯誤包含程序生成的錯誤,該程序以某種方式失敗。與標準輸出類似,此流的默認目的地是終端顯示。
讓我們通過使用ls命令看一個基本的標準錯誤示例。ls列出目錄的內容。
當不帶參數運行時,ls會列出當前目錄中的內容。如果以目錄作為參數運行ls,它將列出所提供目錄的內容。
由於%不是現有目錄,這將將以下文本發送到標準錯誤:
Outputls: cannot access %: No such file or directory
A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.
流重定向
Linux 包含每个流的重定向命令。这些命令可用于将标准输出或标准错误写入文件。如果写入的文件不存在,则会在写入之前创建一个具有该名称的新文件。
带有单括号的命令覆盖目标的现有内容。
覆盖
-
> – 标准输出
-
< – 标准输入
-
2> – 标准错误
带有双括号的命令不会覆盖目标的现有内容。
追加
-
>> – 标准输出
-
<< – 标准输入
-
2>> – 标准错误
管道
管道用於將一個程序的流重定向到另一個程序。當一個程序的標準輸出通過管道發送到另一個程序時,第一個程序的輸出將被用作第二個程序的輸入,而不是被打印到終端。只有第二個程序返回的數據將被顯示。
Linux的管道以垂直條表示:|
以下是使用管道的命令示例:
這將ls
的輸出(顯示當前目錄的內容)管道到less
程序。 less
一次顯示發送到它的數據一行。
ls
通常在多行中顯示目錄內容。當您將其通過less運行時,每個條目都放在新行中。
雖然管道的功能可能看起來類似於>
和>>
,但區別在於管道將數據從一個命令重定向到另一個命令,而>和>>則用於將數據專門重定向到文件。
過濾器
過濾器是一類常與另一個程序的輸出管道一起使用的程序。其中許多在獨立使用時也很有用,但它們特別很好地說明了管道行為。
-
find – 返回與傳遞給find的參數匹配的文件名。
-
grep – 返回與傳遞給grep的字符串模式匹配的文本。
-
tee – 將標準輸入重定向到標準輸出和一個或多個文件。
-
tr – 查找並替換一個字符串為另一個。
-
wc – 計算字符數、行數和單詞數。
例子
現在您已經了解了重定向、管道和基本過濾器,讓我們看一些常見的重定向模式和例子。
command > file
模式將命令的標準輸出重定向到文件。
上述命令將您的主目錄(~
)的內容作為標準輸出傳遞,並將輸出寫入名為root_dir_contents.txt
的文件。它將刪除文件中的任何先前內容,因為它是一個單括號命令。
command > /dev/null
模式將標準輸出重定向到無處。 /dev/null
是一個特殊文件,用於丟棄重定向到它的任何數據。它用於丟棄不需要的標準輸出,否則可能會干擾命令或腳本的功能。發送到 /dev/null
的任何輸出都將被丟棄。
此命令丟棄了由命令ls 返回的標準輸出流,通過將其傳遞給 /dev/null。
command 2> file
模式將命令的標準錯誤流重定向到文件,覆蓋現有內容。
這將錯誤重定向到log.txt
中引發的無效目錄名''
,並將其寫入。請注意,錯誤仍會發送到終端並顯示為文本。
command >> file
模式將命令的標準輸出重定向到文件,而不覆蓋文件的現有內容。
這對命令首先將用戶通過echo輸入的文本重定向到一個新文件。然後,它將第二個echo命令接收到的文本附加到現有文件中,而不覆蓋其內容。
以上的command 2>> file
模式將命令的標準錯誤流重定向到一個文件,而不會覆蓋文件的現有內容。這種模式對於為程序或服務創建錯誤日誌很有用,因為每次寫入文件時,日誌文件都不會被清除其先前的內容。
以上命令將由無效的find參數引起的錯誤消息重定向到一個名為stderr_log.txt的文件。然後,它將由無效的wc參數引起的錯誤消息附加到同一文件中。
command | command
模式將第一個命令的標準輸出重定向到第二個命令的標準輸入。
此命令在/var及其子文件夾中搜索與字符串deb
匹配的文件名和擴展名,並返回文件的文件路徑,其中每個路徑中的匹配部分均以紅色突出顯示。
command | tee file
模式(包括tee
命令)將命令的標準輸出重定向到一個文件並覆蓋其內容。然後,它在終端顯示重定向的輸出。如果文件不存在,則創建一個新文件。
在此模式的上下文中,tee
通常用於同時查看程序的輸出並將其保存到文件中。
這將/etc/magic
檔案中的字符、行和詞的計數(由Linux shell用於確定文件類型)管道到tee命令,然後將wc
的輸出分為兩個方向,並將其發送到終端顯示和magic_count.txt
文件。對於tee命令,請想像字母T。字母的底部是初始數據,頂部是數據分成兩個不同的方向(標準輸出和終端)。
可以使用多個管道將輸出重定向到多個命令和/或過濾器上。
結論
學習如何使用Linux命令行中內置的重定向功能是一項至關重要的技能。現在您已經了解了重定向和管道的基本工作原理,您將能夠開始您的Shell腳本編寫之旅,這些腳本經常使用本指南中突出顯示的程序和模式。
在需要使用命令行完成特定任務時,搜索特定命令或您想要在命令行中執行的操作(例如“刪除以大寫字母開頭的目錄中的所有文件”)也可能會很有幫助。
Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection