了解Linux I/O(輸入/輸出)重定向的基本知識

在Linux管理中,最重要和有趣的話題之一是I/O重定向。命令行的這個功能使您能夠將命令的輸入和/或輸出從文件重定向到文件,或使用管道將多個命令連接在一起,形成所謂的“命令管線”。

我們運行的所有命令基本上都會產生兩種類型的輸出:

  1. 命令結果 – 程式設計的數據,以及
  2. 程序狀態和錯誤消息,通知用戶有關程序執行細節。

在Linux和其他類Unix系統中,還有三個默認文件,下面是它們的名稱,也是shell使用文件描述符號碼識別的:

  1. stdin或0 – 它連接到鍵盤,大多數程序從該文件讀取輸入。
  2. stdout或1 – 它連接到屏幕,所有程序將結果發送到該文件
  3. stderr或2 – 程序將狀態/錯誤消息發送到該文件,該文件也連接到屏幕。

因此,I/O重定向允許您更改命令的輸入來源以及其輸出和錯誤消息的發送位置。這是通過“<”“>”重定向運算符實現的。

如何在Linux中將標準輸出重定向到文件

您可以像下面的示例那样重定向标准输出,在这里,我们希望存储top命令的输出以供以后检查:

$ top -bn 5 >top.log

标志:

  1. -b – 启用top以批处理模式运行,这样您就可以将其输出重定向到文件或其他命令。
  2. -n – 指定命令终止之前的迭代次数。

您可以使用cat命令查看top.log文件的内容,如下所示:

$ cat top.log

要追加命令的输出,请使用“>>”操作符。

例如,要在top.log文件中追加上述top命令的输出,特别是在脚本(或命令行)中,输入以下行:

$ 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 
Redirect Standard Error to File

為了追加標準錯誤,使用以下命令:

$ ls -l /root/ 2>>ls-error.log

如何將標準輸入/錯誤導向到一個文件

也可以將一個命令的所有輸出(包括標準輸入和標準錯誤) captures 到一個單個文件中。這可以通過指定文件描述符號來實現兩種可能的方式:

1. 第一個是相對較舊的方法,其工作方式如下:

$ ls -l /root/ >ls-error.log 2>&1

上面的命令意味著shell會先將 ls 命令 的輸出傳送到文件 ls-error.log中(使用 >ls-error.log),然後將所有錯誤信息寫入已經導向到文件 ls-error.log 的文件描述符 2(標準輸入)中(使用 2>&1)。這意味著標準錯誤也被傳送到與標準輸入相同的文件中。

2. 第二個方法和直接的方法是:

$ ls -l /root/ &>ls-error.log

您也可以像這樣將標準輸入和標準錯誤追加到單個文件中:

$ ls -l /root/ &>>ls-error.log

如何將標準輸入導向到文件

绝大多数命令都是從標準輸入獲取輸入,並且默認情況下標準輸入連接到鍵盤。

將標準輸入從除了鍵盤以外的文件重定向,請使用以下“<”運算子:

$ cat <domains.list 
Redirect Standard Input to File

如何將標準輸入/輸出重定向到文件

您可以使用sort命令同時執行標準輸入、標準輸出重定向,如下:

$ sort <domains.list >sort.output

如何使用管道進行I/O重定向

要將一個命令的輸出重定向為另一個命令的輸入,您可以使用管道,這是構建複雜操作的有用命令行的強大手段。

例如,下面的命令將列出最近修改的前五個文件

$ ls -lt | head -n 5 

這裡,選項:

  1. -l – 啟用長列表格式
  2. -t按修改時間排序,顯示最新的文件首先顯示
  3. -n – 指定要顯示的標題行數

構建管道的重要命令

在這裡,我們將簡要回顧兩個構建命令管道的重要命令,它們是:

xargs用于从标准输入构建和执行命令行。以下是使用xargs的管道示例,此命令用于在Linux中将文件复制到多个目录:

$ echo /home/aaronkilik/test/ /home/aaronkilik/tmp | xargs -n 1 cp -v /home/aaronkilik/bin/sys_info.sh
Copy Files to Multiple Directories

以及选项:

  1. -n 1 – 指示xargs每个命令行最多使用一个参数,并发送到cp命令
  2. cp – 复制文件
  3. -v显示复制命令的进度

有关更多使用选项和信息,请阅读 xargs手册页:

$ man xargs 

A tee command reads from standard input and writes to standard output and files. We can demonstrate how tee works as follows:

$ echo "Testing how tee command works" | tee file1 
tee Command Example

文件或文本过滤器通常与管道一起用于有效的Linux文件操作,以强大的方式处理信息,比如重新构造命令的输出(这对生成有用的Linux报告至关重要)、修改文件中的文本以及其他Linux系统管理任务

要了解更多关于Linux过滤器和管道的信息,请阅读本文查找访问Apache服务器的前10个IP地址,其中展示了使用过滤器和管道的有用示例。

在本文中,我们解释了Linux中I/O重定向的基础知识。请记得通过下面的反馈部分分享您的想法。

Source:
https://www.tecmint.com/linux-io-input-output-redirection-operators/