Linux重定向(輸入輸出重定向)詳解

2020-07-16 10:05:12
我們知道,Linux 中標準的輸入裝置預設指的是鍵盤,標準的輸出裝置預設指的是顯示器。而本節所要介紹的輸入、輸出重定向,完全可以從字面意思去理解,也就是:
  • 輸入重定向:指的是重新指定裝置來代替鍵盤作為新的輸入裝置;
  • 輸出重定向:指的是重新指定裝置來代替顯示器作為新的輸出裝置。

通常是用檔案或命令的執行結果來代替鍵盤作為新的輸入裝置,而新的輸出裝置通常指的就是檔案。

Linux輸入重定向

對於輸入重定向來說,其需要用到的符號以及作用如表 1 所示。

表 1 輸入重定向中用到的符號及作用
命令符號格式 作用
命令 < 檔案 將指定檔案作為命令的輸入裝置
命令 << 分界符 表示從標準輸入裝置(鍵盤)中讀入,直到遇到分界符才停止(讀入的資料不包括分界符),這裡的分界符其實就是自定義的字串
命令 < 檔案 1 > 檔案 2 將檔案 1 作為命令的輸入裝置,該命令的執行結果輸出到檔案 2 中。

【例 1】
預設情況下,cat 命令會接受標準輸入裝置(鍵盤)的輸入,並顯示到控制台,但如果用檔案代替鍵盤作為輸入裝置,那麼該命令會以指定的檔案作為輸入裝置,並將檔案中的內容讀取並顯示到控制台。

以 /etc/passwd 檔案(儲存了系統中所有使用者的基本資訊)為例,執行如下命令:

[[email protected] ~]# cat /etc/passwd
#這裡省略輸出資訊,讀者可自行檢視
[[email protected] ~]# cat < /etc/passwd
#輸出結果同上面命令相同

注意,雖然執行結果相同,但第一行代表是以鍵盤作為輸入裝置,而第二行程式碼是以 /etc/passwd 檔案作為輸入裝置。

【例 2】

[[email protected] ~]# cat << 0
>c.biancheng.net
>Linux
>0
c.biancheng.net
Linux

可以看到,當指定了 0 作為分界符之後,只要不輸入 0,就可以一直輸入資料。

【例 3】
首先,新建文字檔案 a.tx,然後執行如下命令:

[[email protected] ~]# cat a.txt
[[email protected] ~]# cat < /etc/passwd > a.txt
[[email protected] ~]# cat a.txt
#輸出了和 /etc/passwd 檔案內容相同的資料

可以看到,通過重定向 /etc/passwd 作為輸入裝置,並輸出重定向到 a.txt,最終實現了將 /etc/passwd 檔案中內容複製到 a.txt 中。

Linux輸出重定向

相較於輸入重定向,我們使用輸出重定向的頻率更高。並且,和輸入重定向不同的是,輸出重定向還可以細分為標準輸出重定向和錯誤輸出重定向兩種技術。

例如,使用 ls 命令分別檢視兩個檔案的屬性資訊,但其中一個檔案是不存在的,如下所示:

[[email protected] ~]# touch demo1.txt
[[email protected] ~]# ls -l demo1.txt
-rw-rw-r--. 1 root root 0 Oct 12 15:02 demo1.txt
[[email protected] ~]# ls -l demo2.txt    <-- 不存在的檔案
ls: cannot access demo2.txt: No such file or directory

上述命令中,demo1.txt 是存在的,因此正確輸出了該檔案的一些屬性資訊,這也是該命令執行的標準輸出資訊;而 demo2.txt 是不存在的,因此執行 ls 命令之後顯示的報錯資訊,是該命令的錯誤輸出資訊。

再次強調,要想把原本輸出到螢幕上的資料轉而寫入到檔案中,這兩種輸出資訊就要區別對待。

在此基礎上,標準輸出重定向和錯誤輸出重定向又分別包含清空寫入和追加寫入兩種模式。因此,對於輸出重定向來說,其需要用到的符號以及作用如表 2 所示。

表 2 輸出重定向用到的符號及作用
命令符號格式 作用
命令 > 檔案 將命令執行的標準輸出結果重定向輸出到指定的檔案中,如果該檔案已包含資料,會清空原有資料,再寫入新資料。
命令 2> 檔案 將命令執行的錯誤輸出結果重定向到指定的檔案中,如果該檔案中已包含資料,會清空原有資料,再寫入新資料。
命令 >> 檔案 將命令執行的標準輸出結果重定向輸出到指定的檔案中,如果該檔案已包含資料,新資料將寫入到原有內容的後面。
命令 2>> 檔案 將命令執行的錯誤輸出結果重定向到指定的檔案中,如果該檔案中已包含資料,新資料將寫入到原有內容的後面。
命令 >> 檔案 2>&1
或者
命令 &>> 檔案
將標準輸出或者錯誤輸出寫入到指定檔案,如果該檔案中已包含資料,新資料將寫入到原有內容的後面。注意,第一種格式中,最後的 2>&1 是一體的,可以認為是固定寫法。

【例 4】新建一個包含有 "Linux" 字串的文字檔案 Linux.txt,以及空文字檔案 demo.txt,然後執行如下命令:

[[email protected] ~]# cat Linux.txt > demo.txt
[[email protected] ~]# cat demo.txt
Linux
[[email protected] ~]# cat Linux.txt > demo.txt
[[email protected] ~]# cat demo.txt
Linux     <--這裡的 Linux 是清空原有的 Linux 之後,寫入的新的 Linux
[[email protected] ~]# cat Linux.txt >> demo.txt
[[email protected] ~]# cat demo.txt
Linux
Linux     <--以追加的方式,新資料寫入到原有資料之後
[[email protected] ~]# cat b.txt > demo.txt
cat: b.txt: No such file or directory  <-- 錯誤輸出資訊依然輸出到了顯示器中
[[email protected] ~]# cat b.txt 2> demo.txt
[[email protected] ~]# cat demo.txt
cat: b.txt: No such file or directory  <--清空檔案,再將錯誤輸出資訊寫入到該檔案中
[[email protected] ~]# cat b.txt 2>> demo.txt
[[email protected] ~]# cat demo.txt
cat: b.txt: No such file or directory
cat: b.txt: No such file or directory  <--追加寫入錯誤輸出資訊