Linux系列之重定向操作
- 2022 年 8 月 7 日
- 筆記
前言
I/O重定向允許我們將命令的輸入和輸出重定向到文件中,以及將多個命令連接到一起成為管道。本文就來介紹有關重定向的知識。
標準輸入、輸出、錯誤
輸出包括兩種類型:
- 程式的結果。被稱為標準輸出或者
stdout。 - 狀態以及錯誤資訊。被稱為標準錯誤或者
stderr。
除此之外,一些程式從標準輸入stdin中獲取輸入。默認情況下,標準輸入與鍵盤相連接。
默認情況下,stdout和stderr 都被鏈接到螢幕上,而不是保存到文件中。重定向允許我們改變輸出的去向和輸入的來源。
重定向標準輸出
為了重定向到其他文件而不是螢幕上,我們使用>重定向操作符,後面跟隨文件的名稱。
舉例來說,我們可以使用重定向操作符來告訴shell,發送ls命令的輸出到ls-output.txt文件中,而不是螢幕上。
ls -l /usr/bin > ls-output.txt
我們可以看到,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

