大多數(shù) UNIX 系統(tǒng)命令從你的終端接受輸入,并將所產(chǎn)生的輸出發(fā)送回??到您的終端屈溉。一個命令通常從一個叫標準輸入的地方讀取輸入塞关,默認情況下,這恰好是你的終端子巾。同樣帆赢,一個命令通常將其輸出寫入到標準輸出,默認情況下线梗,這也是你的終端椰于。重定向的意思就是將這種標準默認的輸入和輸出重新按照命令定向到指定的地方。
1仪搔、重定向命令列表
需要注意的是文件描述符 0 通常是標準輸入(STDIN)瘾婿,1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)
2烤咧、輸出重定向
- 語法
command1 > file1
上面這個命令執(zhí)行command1然后將輸出的內(nèi)容存入file1偏陪。
注意任何file1內(nèi)的已經(jīng)存在的內(nèi)容將被新內(nèi)容替代。如果要將新內(nèi)容添加在文件末尾煮嫌,請使用>>操作符笛谦。
- 實例
who > users
執(zhí)行上面的 who 命令,它將命令的完整的輸出重定向在用戶文件中(users):
$ cat users
tianqixin console Oct 31 17:35
輸出重定向會覆蓋文件內(nèi)容昌阿,請看下面的例子:
$ echo "菜鳥教程:www.runoob.com" > users
$ cat users
菜鳥教程:www.runoob.com
如果不希望文件內(nèi)容被覆蓋饥脑,可以使用 >> 追加到文件末尾恳邀,例如:
$ echo "菜鳥教程:www.runoob.com" >> users
$ cat users
菜鳥教程:www.runoob.com
菜鳥教程:www.runoob.com
3、輸出重定向
- 和輸出重定向一樣好啰,Unix 命令也可以從文件獲取輸入轩娶,語法為:
command1 < file1
這樣,本來需要從鍵盤獲取輸入的命令會轉(zhuǎn)移到文件讀取內(nèi)容框往。
注意:輸出重定向是大于號(>)鳄抒,輸入重定向是小于號(<)。
- 實例
我們需要統(tǒng)計users文件的行數(shù)椰弊,執(zhí)行一下命令
$ wc -l users
2 users
也可以將輸入重定向到 users 文件:
$ wc -l < users
2
注意:上面兩個例子的結(jié)果不同:第一個例子许溅,會輸出文件名;第二個不會秉版,因為它僅僅知道從標準輸入讀取內(nèi)容贤重。
4、同時替換輸入和輸出
command1 < infile > outfile
同時替換輸入和輸出清焕,執(zhí)行command1并蝗,從文件infile讀取內(nèi)容,然后將輸出寫入到outfile中秸妥。
5滚停、重定向深入講解
一般情況下,每個 Unix/Linux 命令運行時都會打開三個文件:
- 標準輸入文件(stdin):stdin的文件描述符為0粥惧,Unix程序默認從stdin讀取數(shù)據(jù)键畴。
- 標準輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認向stdout輸出數(shù)據(jù)突雪。
- 標準錯誤文件(stderr):stderr的文件描述符為2起惕,Unix程序會向stderr流中寫入錯誤信息。
默認情況下咏删,command > file 將 stdout 重定向到 file惹想,command < file 將stdin 重定向到 file。
- a督函、如果希望 stderr 重定向到 file勺馆,可以這樣寫:
$ command 2 > file
- b、如果希望 stderr 追加到 file 文件末尾侨核,可以這樣寫:
$ command 2 >> file
2 表示標準錯誤文件(stderr)。
- c灌灾、如果希望將 stdout 和 stderr 合并后重定向到 file搓译,可以這樣寫:
$ command > file 2>&1
或者
$ command >> file 2>&1
- d、如果希望對 stdin 和 stdout 都重定向锋喜,可以這樣寫:
$ command < file1 >file2
command 命令將 stdin 重定向到 file1些己,將 stdout 重定向到 file2豌鸡。
6、/dev/null 文件
如果希望執(zhí)行某個命令段标,但又不希望在屏幕上顯示輸出結(jié)果涯冠,那么可以將輸出重定向到 /dev/null
$ command > /dev/null
/dev/null 是一個特殊的文件,寫入到它的內(nèi)容都會被丟棄逼庞;如果嘗試從該文件讀取內(nèi)容蛇更,那么什么也讀不到。但是 /dev/null 文件非常有用赛糟,將命令的輸出重定向到它派任,會起到"禁止輸出"的效果
如果希望屏蔽 stdout 和 stderr,可以這樣寫:
$ command > /dev/null 2>&1