重定向和管道是系統管理員和開發人員經常使用的 bash 腳本的兩個有用功能。在本指南中 Bash 重定向 如何使用示例命令在 Bash 中使用重定向。

在了解重定向如何工作之前,了解文件描述符是什麼很重要。

內容

  1. 什麼是文件描述符?
  2. 將輸出重定向到文件
  3. 如何處理標準錯誤
  4. 什麼是/dev/null?
  5. Bash 中的輸入重定向
  6. 概括

什麼是文件描述符?

當你在 Linux 上打開一個文件時,每個文件都會被分配一個整數,這個信息存儲在內核中。這樣,內核就知道哪些文件打開了,哪些進程打開了這些文件。分配的整數稱為文件描述符(簡稱 FD)。

默認情況下,所有程序都以三個文件描述符開頭。

  • FD 0-> 標準輸入 (stdin)-> 鍵盤
  • FD 1-> 標準輸出(Stdout)-> 顯示(終端)
  • FD 2-> 標準錯誤(Stderr)-> 顯示(終端)

你能行的 /dev 目錄:

$ ls -l /dev/std*
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stdout -> /proc/self/fd/1

Stdin (FD0) 從鍵盤獲取輸入。 stdout (FD1) 和 stderr (FD2) 被發送到終端。使用管道和重定向時,您可以更改輸入的傳遞方式以及輸出和錯誤的發送方式。

將輸出重定向到文件

如上所述,程序輸出(stdout)和錯誤(stderr)被發送到終端。你可以使用它 重定向運算符”>” 將標準輸出和標準錯誤寫入文件。

請參見下面的示例。我在跑 uname -mrs 運行命令並將輸出重定向到一個名為 uname.log..

$ uname -mrs > uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64
將輸出重定向到文件

筆記: 使用時 ">" 如果運算符和文件不可用,則將創建它們。如果文件已經存在,它將被新內容覆蓋。

您還可以使用文件描述符編號 標準輸出 (1) 將輸出重定向到重定向運算符之前的文件。

$ uname -mrs 1> uname.log

如前所述,單個重定向運算符 (>) 僅當文件已存在時才覆蓋文件的內容。但是,如果要添加內容而不是覆蓋同一文件,請使用雙重定向運算符(即)。 >>)。您還可以在此處使用標準輸出文件描述符 (1)。

$ whoami >> uname.log
$ echo $SHELL 1>> uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64
ostechnix
/bin/bash
向文件中添加內容

如何處理標準錯誤

每個程序都會產生輸出和錯誤,都發送到終端。在許多情況下,忽略錯誤或隔離錯誤並將其重定向到另一個文件以進行故障排除是個好主意。

讓我們看一個簡單的例子 ls 一個命令來看看它是如何工作的。 我正在嘗試列出兩個文件,並且只列出其中一個。如前所述,我在終端中收到錯誤和輸出。

$ ls -l uname.log u1.log
ls: cannot access 'u1.log': No such file or directory
-rw-r--r-- 1 ostechnix ostechnix 48 Aug 27 07:37 uname.log

我也在做同樣的事情 ls 再次運行該命令,但這次將輸出重定向到一個文件。從輸出中可以看出 > 操作員將 stdout (1) 重定向到文件,但將 stderr (2) 發送到終端。

$ ls -l uname.log u1.log > ls.op
ls: cannot access 'u1.log': No such file or directory

將 stderr 重定向到文件 "2>" 操作員。 stderr(2)的文件描述符必須在重定向操作符>之前使用。這只會將錯誤發送到文件。

$ ls -l uname.log u1.log > ls.op 2> ls.err
$ cat ls.err
ls: cannot access 'u1.log': No such file or directory

目前 stdout 和 stderr 被寫入單獨的文件。 您還可以將 stdout 和 stderr 發送到一個文件。

$ ls -l uname.log u1.log 1> ls.op 2> ls.op

重擊 4.4也可以用 &> 簽署 stdout 和 stderr 以重定向到文件。

$ ls -l uname.log u1.log &> ls.op

什麼是/dev/null?

Null 是一個字符特殊文件,它接受輸入,丟棄它,並且不產生輸出。簡而言之,null 會丟棄您重定向的所有內容。

$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Aug 27 06:01 /dev/null

為什麼空值在重定向中很重要?你可能想知道。在某些情況下,您可能不想打印或保存 stdout 或 stderr。在這種情況下,您可以將stdout 或stderr 重定向到/dev/null。這將破壞輸入流。

$ date > /dev/null
$ date 1> /dev/null    # Stdout to Null
$ dateee 2> /dev/null  # WRONG COMMAND, Stderr to Null
$ date &> /dev/null    # Stdout/Stderr to Null

Bash 中的輸入重定向

您還可以像將輸出和錯誤重定向到文件一樣使用輸入重定向運算符(以及如何將輸出和錯誤重定向到文件)。<)。

讓我們從一個簡單的字數統計程序開始。這是我要重定向到的內容 ostechnix.txt 從文件到字數來查找行數。

$ wc -l < ostechnix.txt 
10

您還可以在重定向輸入時傳遞標準輸入文件描述符 (0)。

$ wc -l 0< ostechnix.txt 
10

您可以組合輸入重定向運算符和輸出重定向運算符,如下所示:

$ wc -l < ostechnix.txt &> /tmp/wc.op
$ cat /tmp/wc.op 
10
Bash 中的輸入重定向 Bash 中的輸入重定向

在 while 循環中使用輸入重定向來逐行讀取文件的內容。

請參見下面的示例。經過 /etc/passwd 文件作為輸入 while 命令。這裡 read 該命令逐行讀取並將其存儲在變量中 VAL 另外,寫一個循環條件,看看它是否對用戶可用。

while read VAL; do   
  NAME=$(echo $VAL | awk -F  ":" '/1/ {print $1}' )
  if [[ $NAME = "karthick" ]]
  then
   echo "User spotted"
  fi
done < /etc/passwd

查找系統用戶的腳本

查找系統用戶的腳本

將上述代碼中的“karthick”替換為您的系統用戶名。保存並關閉文件。

這不是實現用戶搜索任務的最佳方式,但它可以用於演示目的。

然後使腳本可執行並運行它。

$ chmod +x ostechnix.sh 
$ ./ostechnix.sh 
User spotted

Bash 支持另一種形式的輸入重定向,稱為 直升機停機坪..有關詳細信息,請參閱以下指南。

  • 初學者的 Bash Here 文檔教程

概括

在本指南中,什麼是 Bash 重定向,什麼是文件描述符,如何將輸出重定向到文件,如何處理 stderr,什麼是 /dev/null,在 Bash 中使用重定向您學習了重要的腳本概念,例如它們如何工作。 Bash 以 Bash 中的輸入重定向結束本指南。

如果你想學習 Bash 腳本,你需要學習和理解這裡描述的概念。為了您的舒適,我們建議您在系統上嘗試本文中顯示的所有命令。

如果您有任何反饋或提示來幫助 Linux 社區和讀者學習 bash 腳本,請隨時在下面的評論部分告訴我們。

推薦閱讀:

  • Bash 腳本——以變量為例
  • Bash Script——以函數為例
  • 如示例中所述的 Bash Script-For 循環
  • Bash Scripting-while循環在示例中說明
  • 使用 Linux 示例對 Bash echo 命令的描述
  • 有用的 Bash 鍵盤快捷鍵列表
  • 帶和不帶導出的 Bash 變量定義的差異

BASHBash 重定向Bash 腳本Bash shellLinuxLinux 管理Linux 基礎Linux 命令Linux howtoPipingRedirectionScriptingShell 腳本