Linux系列之重定向操作

前言

I/O重定向允許我們將命令的輸入和輸出重定向到文件中,以及將多個命令連接到一起成為管道。本文就來介紹有關重定向的知識。

標準輸入、輸出、錯誤

輸出包括兩種類型:

  • 程式的結果。被稱為標準輸出或者stdout。
  • 狀態以及錯誤資訊。被稱為標準錯誤或者stderr 。

除此之外,一些程式從標準輸入stdin中獲取輸入。默認情況下,標準輸入與鍵盤相連接。

默認情況下,stdout和stderr 都被鏈接到螢幕上,而不是保存到文件中。重定向允許我們改變輸出的去向和輸入的來源。

重定向標準輸出

為了重定向到其他文件而不是螢幕上,我們使用>重定向操作符,後面跟隨文件的名稱。

舉例來說,我們可以使用重定向操作符來告訴shell,發送ls命令的輸出到ls-output.txt文件中,而不是螢幕上。

ls -l /usr/bin > ls-output.txt

image.png

我們可以看到,ls命令的輸出沒有發送到螢幕上,而是發送ls-output.txt到文件中。

需要注意的是,使用>重定向操作符會覆蓋目標文件。如果要追加內容,我們可以使用>>重定向操作符。

重定向標準錯誤

為了重定向stderr,我們必須引用其文件描述符。shell將stdout、stdin和stderr分別作為文件描述符0、1和2的內部引用。我們可以用這個符號重定向stderr。

ls -l /bin/usr 2> ls-error.txt

重定向到同一文件

重定向標準輸出和標準錯誤到同一文件中,共有兩種方式可以實現。首先讓我們使用傳統方法,它適用於老版本的shell :

ls -l /bin/usr > ls-output.txt 2>&1

首先,我們將stdout重定向到ls-output.txt文件,然後用2>&1的符號將文件描述符2 stderr重定向到文件描述符1 stdout 中。

需要注意重定向的順序,重定向stderr必須總是在重定向stdout之後發生。

最近版本的bash提供了第二種方法,該方法讓執行這種組合重定向更精簡。

ls -l /bin/usr &> ls-output.txt

你仍然可以使用>>進行追加操作。

處理不需要的輸出

系統提供了一種方法,可以將輸出重定向到一個叫做/dev/null的特殊文件,該文件通常被稱為比特桶(bit bucket)。它接受輸入,但不做任何處理。

ls -l /bin/usr 2> /dev/null

重定向標準輸入

還有< 重定向操作符,我們可以將stdin的來源從鍵盤改為文件。

cat < sample.txt

管道

使用管道操作符| ,一個命令的stout可以通過管道進入另一個命令的stdin,less就是一個例子:

ls -l /usr/bin | less

可以把幾個命令放在一起,組成一個流水線。使用這種方式的命令被稱為過濾器。過濾器接受輸入,以某種方式改變它,然後輸出它。

tee命令

tee命令讀取stdin並將其複製到stdout和一個或多個文件中。

ls /usr/bin | tee ls.txt | grep zip

image.png

Tags: