我們知道,linux 中標準的輸入裝置預設指的是鍵盤,標準的輸出裝置預設指的是顯示器。而本節所要介紹的輸入、輸出重定向,完全可以從字面意思去理解,也就是:
通常是用檔案或命令的執行結果來代替鍵盤作為新的輸入裝置,而新的輸出裝置通常指的就是檔案。在此基礎上,標準輸出重定向和錯誤輸出重定向又分別包含清空寫入和追加寫入兩種模式。因此,對於輸出重定向來說,其需要用到的符號以及作用如表 2 所示。對於輸入重定向來說,其需要用到的符號以及作用如表 1 所示。
表 1 輸入重定向中用到的符號及作用
命令符號格式
作用命令 < 檔案
將指定檔案作為命令的輸入裝置
命令 << 分界符
表示從標準輸入裝置(鍵盤)中讀入,直到遇到分界符才停止(讀入的資料不包括分界符),這裡的分界符其實就是自定義的字串
命令 < 檔案 1 > 檔案 2
將檔案 1 作為命令的輸入裝置,該命令的執行結果輸出到檔案 2 中。
【例 1】
預設情況下,cat 命令會接受標準輸入裝置(鍵盤)的輸入,並顯示到控制台,但如果用檔案代替鍵盤作為輸入裝置,那麼該命令會以指定的檔案作為輸入裝置,並將檔案中的內容讀取並顯示到控制台。
以 /etc/passwd 檔案(儲存了系統中所有使用者的基本資訊)為例,執行如下命令:
[root@localhost ~]# cat /etc/passwd
#這裡省略輸出資訊,讀者可自行檢視
[root@localhost ~]# cat < /etc/passwd
#輸出結果同上面命令相同
注意,雖然執行結果相同,但第一行代表是以鍵盤作為輸入裝置,而第二行**是以 /etc/passwd 檔案作為輸入裝置。
【例 2】
[root@localhost ~]# cat << 0
>c.biancheng.net
>linux
>0
c.biancheng.net
linux
可以看到,當指定了 0 作為分界符之後,只要不輸入 0,就可以一直輸入資料。
【例 3】
[root@localhost ~]# cat a.txt
[root@localhost ~]# cat < /etc/passwd > a.txt
[root@localhost ~]# cat a.txt
#輸出了和 /etc/passwd 檔案內容相同的資料
可以看到,通過重定向 /etc/passwd 作為輸入裝置,並輸出重定向到 a.txt,最終實現了將 /etc/passwd 檔案中內容複製到 a.txt 中。相較於輸入重定向,我們使用輸出重定向的頻率更高。並且,和輸入重定向不同的是,輸出重定向還可以細分為標準輸出重定向和錯誤輸出重定向兩種技術。
例如,使用 ls 命令分別檢視兩個檔案的屬性資訊,但其中乙個檔案是不存在的,如下所示:
[root@localhost ~]# touch demo1.txt
[root@localhost ~]# ls -l demo1.txt
-rw-rw-r--. 1 root root 0 oct 12 15:02 demo1.txt
[root@localhost ~]# ls -l demo2.txt <-- 不存在的檔案
ls: cannot access demo2.txt: no such file or directory
上述命令中,demo1.txt 是存在的,因此正確輸出了該檔案的一些屬性資訊,這也是該命令執行的標準輸出資訊;而 demo2.txt 是不存在的,因此執行 ls 命令之後顯示的報錯資訊,是該命令的錯誤輸出資訊。再次強調,要想把原本輸出到螢幕上的資料轉而寫入到檔案中,這兩種輸出資訊就要區別對待。
表 2 輸出重定向用到的符號及作用
命令符號格式
作用命令 > 檔案
將命令執行的標準輸出結果重定向輸出到指定的檔案中,如果該檔案已包含資料,會清空原有資料,再寫入新資料。
命令 2> 檔案
將命令執行的錯誤輸出結果重定向到指定的檔案中,如果該檔案中已包含資料,會清空原有資料,再寫入新資料。
命令 >> 檔案
將命令執行的標準輸出結果重定向輸出到指定的檔案中,如果該檔案已包含資料,新資料將寫入到原有內容的後面。
命令 2>> 檔案
將命令執行的錯誤輸出結果重定向到指定的檔案中,如果該檔案中已包含資料,新資料將寫入到原有內容的後面。
命令 >> 檔案 2>&1
或者命令 &>> 檔案
將標準輸出或者錯誤輸出寫入到指定檔案,如果該檔案中已包含資料,新資料將寫入到原有內容的後面。注意,第一種格式中,最後的 2>&1 是一體的,可以認為是固定寫法。
[root@localhost ~]# cat linux.txt > demo.txt
[root@localhost ~]# cat demo.txt
linux
[root@localhost ~]# cat linux.txt > demo.txt
[root@localhost ~]# cat demo.txt
linux <--這裡的 linux 是清空原有的 linux 之後,寫入的新的 linux
[root@localhost ~]# cat linux.txt >> demo.txt
[root@localhost ~]# cat demo.txt
linux
linux <--以追加的方式,新資料寫入到原有資料之後
[root@localhost ~]# cat b.txt > demo.txt
cat: b.txt: no such file or directory <-- 錯誤輸出資訊依然輸出到了顯示器中
[root@localhost ~]# cat b.txt 2> demo.txt
[root@localhost ~]# cat demo.txt
cat: b.txt: no such file or directory <--清空檔案,再將錯誤輸出資訊寫入到該檔案中
[root@localhost ~]# cat b.txt 2>> demo.txt
[root@localhost ~]# cat demo.txt
cat: b.txt: no such file or directory
cat: b.txt: no such file or directory <--追加寫入錯誤輸出資訊
linux輸入輸出重定向
基本概念 這是理解後面的知識的前提,請務必理解 a i o重定向通常與 fd有關,shell的fd通常為10個,即 0 9 b 常用fd有3個,為0 stdin,標準輸入 1 stdout,標準輸出 2 stderr,標準錯誤輸出 預設與keyboard monitor有關 c 用 來改變讀進的資料...
Linux輸入輸出重定向
標準輸入輸出 裝置 裝置檔名 檔案描述符 型別鍵盤 dev stdin 0標準輸入 顯示器 dev stdout 1標準輸出 顯示器 dev stderr 2標準錯誤輸出 輸出重定向 輸出重定向符號 1 標準輸出重定向 命令 檔案 以覆蓋方式把命令的正確輸出重定向到檔案或裝置 命令 檔案 以追加的方...
Linux 輸入輸出重定向
一 相關知識 1 預設地,標準的輸入為鍵盤,但是也可以來自檔案或管道 pipe 2 預設地,標準的輸出為終端 terminal 但是也可以重定向到檔案,管道或後引號 backquotes 3 預設地,標準的錯誤輸出到終端,但是也可以重定向到檔案。4 標準的輸入,輸出和錯誤輸出分別表示為stdin,s...