作者: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 文件。
- 對(duì)于
注:
- 輸出重定向完整的寫(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)<用于輸入重定向。