輸出重定向
重定向通常經過在命令間插入特定的符號來實現。特別的,這些符號的語法以下所示
上面這個命令執行command1而後將輸出的內容存入file1。
注意任何file1內的已經存在的內容將被新內容替代。若是要將新內容添加在文件末尾,請使用>>操做符。
實例
執行下面的 who 命令,它將命令的完整的輸出重定向在用戶文件中(users)
執行後,並無在終端輸出信息,這是由於輸出已被從默認的標準輸出設備(終端)重定向到指定的文件。
你可使用 cat 命令查看文件內容
cat users
h tty7 2017-08-10 11:48 (:0)
輸入重定向
和輸出重定向同樣,Unix 命令也能夠從文件獲取輸入,語法爲
這樣,原本須要從鍵盤獲取輸入的命令會轉移到文件讀取內容
注意:輸出重定向是大於號(>),輸入重定向是小於號(<)
實例
接着以上實例,咱們須要統計 users 文件的行數,執行如下命令
wc(Word Count)命令的功能爲統計指定文件中的字節數、字數、行數,並將統計結果顯示輸出:-l 統計行數
也能夠將輸入重定向到 users 文件
注意:上面兩個例子的結果不一樣:第一個例子,會輸出文件名;第二個不會,由於它僅僅知道從標準輸入讀取內容。
command1 <infile >outfile
同時替換輸入和輸出,執行command1,從文件infile讀取內容,而後將輸出寫入到outfile中。
重定向深刻講解
通常狀況下,每一個 Unix/Linux 命令運行時都會打開三個文件:
- 標準輸入文件(stdin):stdin的文件描述符爲0,Unix程序默認從stdin讀取數據
- 標準輸出文件(stdout):stdout 的文件描述符爲1,Unix程序默認向stdout輸出數據
- 標準錯誤文件(stderr):stderr的文件描述符 爲2,Unix程序會向stderr流中寫入錯誤信息
默認狀況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。bash
若是但願 stderr 重定向到 file,能夠這樣寫:
若是但願 stderr 追加到 file 文件末尾,能夠這樣寫:
2 表示標準錯誤文件(stderr)。
若是但願將 stdout 和 stderr 合併後重定向到 file,能夠這樣寫:
$ command >file 2>&1
# 或者
$ command >>file 2>&1
# & 表示等同於的意思,2>&1,表示2的輸出重定向等同於1
若是但願對 stdin 和 stdout 都重定向,能夠這樣寫:
command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2
Here Document
Here Document 是 Shell 中的一種特殊的重定向方式,用來將輸入重定向到一個交互式 Shell 腳本或程序。
它的基本形式以下:
command <<delimiter
document
delimiter
它的做用是將兩個 delimiter 之間的內容(document) 做爲輸入傳遞給 command。
注意:
結尾的delimiter 必定要頂格寫,前面不能有任何字符,後面也不能有任何字符,包括空格和 tab 縮進。開始的delimiter先後的空格會被忽略掉。
實例
在命令行中經過 wc -l 命令計算 Here Document 的行數:
$ wc -l <<EOF
歡迎來到
弗雷塞斯
www.cnblogs.com/freescience
EOF
3 # 輸出結果爲 3 行
咱們也能夠將 Here Document 用在腳本中,例如:
#!/bin/bash
cat <<EOF
歡迎來到
弗雷塞斯
www.cnblogs.com/freescience
EOF
執行以上腳本,輸出結果:
歡迎來到
弗雷塞斯
www.cnblogs.com/freescience
/dev/null 文件
若是但願執行某個命令,但又不但願在屏幕上顯示輸出結果,那麼能夠將輸出重定向到 /dev/null:
/dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;若是嘗試從該文件讀取內容,那麼什麼也讀不到。可是 /dev/null 文件很是有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。
若是但願屏蔽 stdout 和 stderr,能夠這樣寫:
注意:0 是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)