Linux Shell重定向(輸入輸出重定向)

作者:Gakki

前言
  • 在 bash 中,在執(zhí)行一個(gè)命令之前,可以使用重定向操作符對(duì)該命令的輸入、輸出進(jìn)行重定向。從其他文件獲取輸入,把命令輸出寫(xiě)到其他文件。
  • 定向分為輸入重定向與輸出重定向。字面上理解就是改變輸入/輸出的方向
  • 一般情況下,標(biāo)準(zhǔn)的輸入方向就是從鍵盤(pán)到程序;標(biāo)準(zhǔn)的輸出方向就是從程序到顯示器。
  • Linux 中一切皆文件,包括標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))和標(biāo)準(zhǔn)輸出設(shè)備(顯示器)在內(nèi)的所有計(jì)算機(jī)硬件都是文件。為了表示和區(qū)分已經(jīng)打開(kāi)的文件,Liunx 會(huì)給給每個(gè)文件分配一個(gè) ID ,這個(gè) ID 就是一個(gè)整數(shù),被稱為文件描述符(File Descriptor)。
文件描述符 文件名 類型 硬件 備注
0 STDIN 標(biāo)準(zhǔn)輸入文件 鍵盤(pán) 默認(rèn)從stdin讀取數(shù)據(jù)
1 STDOUT 標(biāo)準(zhǔn)輸出文件 顯示器 默認(rèn)向stdout輸出數(shù)據(jù)
2 STDERR 標(biāo)準(zhǔn)錯(cuò)誤輸出文件 顯示器 向stderr流中寫(xiě)入錯(cuò)誤信息
  • 注:一般情況下,每個(gè) Unix/Linux 命令運(yùn)行時(shí)都會(huì)打開(kāi)三個(gè)文件。stdin、stdout、stderr 默認(rèn)都是打開(kāi)的,在重定向的過(guò)程中,0、1、2 這三個(gè)文件描述符可以直接使用。
輸出重定向
  • 在輸出重定向中,> 表示覆蓋,>>表示追加。
# 標(biāo)準(zhǔn)輸出重定向 
command >file:以覆蓋的方式,把 command 的正確輸出結(jié)果輸出到 file 文件中。
command >>file: 以追加方式,把 command 的正確輸出結(jié)果輸出到 file 文件中。

# 標(biāo)準(zhǔn)錯(cuò)誤輸出重定向
command 2>file:以覆蓋的方式,把 command 的錯(cuò)誤信息輸出到 file 文件中。
command 2>>file:以追加的方式,把 command 的錯(cuò)誤信息輸出到 file 文件中。

# 正確輸出和錯(cuò)誤信息同時(shí)保存
command >file 2>&1:以覆蓋的方式,把正確輸出和錯(cuò)誤信息同時(shí)保存到同一文件(file)中。
command >>file 2>&1:以追加的方式,把正確輸出和錯(cuò)誤信息同時(shí)保存到同一個(gè)文件(file)中。
command > file1 2>file2:以覆蓋的方式,把正確的輸出結(jié)果輸出到 file1 文件中,把錯(cuò)誤的信息輸出到 file2 文件中。
command >>file1 2>>file2:以追加的方式,把正確的輸出結(jié)果輸出到 file1 文件后中,把錯(cuò)誤的信息輸出到 file2 文件中。
command >file 2>file 或 command >>file 2>>file:【不推薦】,會(huì)導(dǎo)致 file 打開(kāi)兩次,引起資源競(jìng)爭(zhēng),導(dǎo)致 stdout 和 stderr 會(huì)互相覆蓋

注:

  • 如果希望執(zhí)行某個(gè)命令,但又不希望在屏幕上顯示輸出結(jié)果,那么可以將輸出重定向到 /dev/null 。命令:command > /dev/null。/dev/null是一個(gè)文件,這個(gè)文件比較特殊,所有寫(xiě)入到它的內(nèi)容都會(huì)被丟棄。但是 /dev/null 文件非常有用,將命令的輸出重定向到它,會(huì)起到"禁止輸出"的效果。如果希望屏蔽 stdout 和 stderr,可以這樣寫(xiě):command > /dev/null 2>&1。
  • 2>&1:表示復(fù)制標(biāo)準(zhǔn)錯(cuò)誤輸出的文件描述符 2 到標(biāo)準(zhǔn)輸出的文件描述符 1。
輸入重定向
  • 輸入重定向就是改變輸入的方向,不再使用鍵盤(pán)作為命令輸入的來(lái)源,而是使用文件作為命令的輸入。
符號(hào) 說(shuō)明
command <file 將 file 文件中的內(nèi)容作為 command 的輸入。
command <<tag 從標(biāo)準(zhǔn)輸入(鍵盤(pán))中讀取數(shù)據(jù),直到遇見(jiàn)分界符 tag 才停止(分界符可以是任意的字符串,用戶自己定義)
command <file1 >file2 將 file1 作為 command 的輸入,并將 command 的處理結(jié)果輸出到 file2

注: 輸入重定向的完整寫(xiě)法也是 fd<file ,其中 fd 表示文件描述符,如果不寫(xiě),默認(rèn)為 0,也就是標(biāo)準(zhǔn)輸入文件。

重定向的先后順序
  • 重定向的先后順序:當(dāng)指定了多個(gè)重定向操作時(shí),按照重定向出現(xiàn)的順序,從左到右處理。
  • command > file 2>&1:將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤指向文件 file
  • command 2>&1 > file:只將標(biāo)準(zhǔn)輸出定向到文件 file。因?yàn)樵趯?biāo)準(zhǔn)輸出重定向到 file 之前,標(biāo)準(zhǔn)錯(cuò)誤已經(jīng)從標(biāo)準(zhǔn)輸出中復(fù)制了。
  • 解釋說(shuō)明:
    • 對(duì)于 command > file 2>&1 命令來(lái)說(shuō),第一個(gè) > file 表示重定向 command 命令的標(biāo)準(zhǔn)輸出到 file 文件。第二個(gè) 2>&1 表示復(fù)制標(biāo)準(zhǔn)錯(cuò)誤輸出到標(biāo)準(zhǔn)輸出。由于標(biāo)準(zhǔn)輸出已經(jīng)被重定向到 file 文件,所以 file 文件會(huì)包含 command 命令的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出。
    • command 2>&1 > file 命令只重定向標(biāo)準(zhǔn)輸出到 file 文件,標(biāo)準(zhǔn)錯(cuò)誤輸出只會(huì)打印打終端。第一個(gè) 2>&1 表示復(fù)制標(biāo)準(zhǔn)錯(cuò)誤輸出到標(biāo)準(zhǔn)輸出,換句話說(shuō)就是:把標(biāo)準(zhǔn)錯(cuò)誤輸出寫(xiě)入到標(biāo)準(zhǔn)輸出對(duì)應(yīng)的文件。但此時(shí)標(biāo)準(zhǔn)輸出還沒(méi)有重定向,會(huì)關(guān)聯(lián)到默認(rèn)的終端,所以標(biāo)準(zhǔn)錯(cuò)誤輸出會(huì)寫(xiě)入到終端。
      第二個(gè) > file 表示把標(biāo)準(zhǔn)輸出重定向到 file 文件。這并不會(huì)影響到標(biāo)準(zhǔn)錯(cuò)誤輸出,標(biāo)準(zhǔn)錯(cuò)誤輸出還是會(huì)指向終端。因此,標(biāo)準(zhǔn)錯(cuò)誤輸出沒(méi)有重定向到 file 文件。

注:

  • 輸出重定向完整的寫(xiě)法是 fd>file 或者 fd>> file ,其中 fd 表示文件描述符。如果不寫(xiě),默認(rèn)為 1 。也就是標(biāo)準(zhǔn)輸出文件。如:command 1> file 一般寫(xiě)作 command >file。當(dāng)文件描述符為大于 1 的值時(shí),比如 2,就必須寫(xiě)上。
  • fd> 之間不能有空格,否則 Shell 會(huì)解析失??;>file 之間的空格可有可無(wú)。為了保持一致性,建議 > 兩邊都不加空格。
其他
  • 大于符號(hào) > 用于輸出重定向,小于符號(hào) < 用于輸入重定向。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大多數(shù)UNIX系統(tǒng)命令從你的終端接受輸入并將所產(chǎn)生的輸出發(fā)送回??到您的終端。一個(gè)命令通常從一個(gè)叫標(biāo)準(zhǔn)輸入的地方讀...
    Leon_Geo閱讀 665評(píng)論 0 7
  • 大多數(shù)UNIX系統(tǒng)命令從你的終端接受輸入并將所產(chǎn)生的輸出發(fā)送回??到您的終端。一個(gè)命令通常從一個(gè)叫標(biāo)準(zhǔn)輸入的地方讀...
    Leon_Geo閱讀 333評(píng)論 0 2
  • 輸出重定向 命令的輸出不僅可以是顯示器,還可以很容易的轉(zhuǎn)移向到文件,這被稱為輸出重定向。命令輸出重定向的語(yǔ)法為: ...
    吃貓的魚(yú)0閱讀 742評(píng)論 0 0
  • 一、標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤 對(duì)于 Linux 內(nèi)核中的標(biāo)準(zhǔn) I/O 庫(kù),stdio 提供了一個(gè)高效的緩存 I...
    Manchangdx閱讀 3,692評(píng)論 1 3
  • linux文件描述符:可以理解為linux跟蹤打開(kāi)文件,而分配的一個(gè)數(shù)字,這個(gè)數(shù)字有點(diǎn)類似c語(yǔ)言操作文件時(shí)候的句柄...
    SkTj閱讀 658評(píng)論 0 1

友情鏈接更多精彩內(nèi)容