1、重新導向相關檔案描述符
1)檔案描述符
① 0 標準輸入,/dev/stdin -> /proc/self/fd/0
② 1 標準輸出,/dev/stdout -> /proc/self/fd/1
③ 2 標準錯誤輸出,/dev/stderr -> /proc/self/fd/2
2)重新導向
① > 是1>的簡寫
② < 是0<的簡寫
③ > 將命令輸出寫入到檔案或裝置(例如印表機)中,而不是寫在命令提示字元視窗中。
④ >> 將命令輸出添加到檔案末尾而不刪除檔案中的資訊。
⑤ >& 將一個控制代碼的輸出寫入到另一個控制代碼的輸入中。
2>&1聲明檔案描述符2為檔案描述符1的副本(嚴格的說是通過複製檔案描述符 1 來建立檔案描述符 2 ,但效果通常是合并了兩個流)。
3)其它
① >>file 將 STDOUT字串追加到檔案內容之後
② >file將 STDOUT重新導向到新檔案,當設定 $noclobber 時,可重寫檔案
③ >&file將STDOUT及STDERR(/dev/stdout)重新導向到檔案(command >& file)
④ >>&將 STDOUT及STDERR(/dev/stderr) 字串追加到檔案內容之後(command >>& file)
⑤ [n]>&-關閉 STDOUT或檔案描述符n(command >&-)
2、注意
1)shell遇到”>”操作符,會判斷右邊檔案是否存在,如存在就先刪除,且建立新檔案;不存在直接建立。無論左邊命令執行是否成功,右邊檔案都會變為空白。
2)“>>”操作符,判斷右邊檔案,如果不存在,先建立。以添加方式開啟檔案,會分配一個檔案描述符[不特別指定,預設為1,2]然後,與左邊的標準輸出或錯誤輸出綁定。
3)當命令執行完,繫結檔案的描述符也自動失效,0,1,2又會空閑。
4)命令在執行前,先會檢查輸出是否正確,如輸出裝置錯誤,將不會執行命令。
5)IO重新導向中,stdout與stderr的管道會先準備好,才從stdin 讀資料
6)tee 在不影響原I/O 的情況下,將stdout 複製一份到檔案去
7)bash執行命令過程:分析命令-變數求值-命令替代(``和$( ))-重新導向-萬用字元展開-確定路徑-執行命令
8)( )將command group置於sub-shell執行,也稱nested sub-shell,有一點非常重要的特性是:繼承父shell的Standard input, output, and error plus any other open file descriptors。
3、樣本
1)cat>catfile <test.sh #cat從test.sh獲得輸入資料,然後輸出給檔案catfile
2)cat > catfile #從標準鍵盤獲得資料,輸出到catfile
3)cat>catfile <<eof #這裡,"<<",代表"結束的輸入字元"。當空行輸入eof字元,輸入自動結束,不用ctrl+D
4)cat <>file 以讀寫的方式開啟 file;
5)cmd << delimiter >file,從stdin 中讀入,直至遇到 delimiter 分界符
4、exec
1)exec命令:常用來替代當前shell 並重新啟動一個shell,也就是說,並沒有啟動子shell。使用這一命令時任何現有環境都將會被清除。exec在對檔案描述符進行操作的時候,不會覆蓋當前的shell環境。
2)命令格式
exec 檔案描述符[n] <或> file或檔案描述符或裝置
3)在上面所述的輸入,輸出重新導向,將輸入,輸出繫結檔案或裝置後,只對當前那條指令是有效,如果需要在綁定之後,接下來的所有命令都支援的話,就需要用exec命令。
5、exec樣本
1)exec 6>&1 #將標準輸出與fd 6綁定
ls /proc/self/fd/
2)exec 1>&6 #恢複標準輸出
3)exec 6>&- #關閉fd 6描述符
參考
【1】 man手冊
【2】 總結不錯
http://hi.baidu.com/xxjyz/blog/item/59bbbb0394856d1c4bfb51ee.html
http://blog.163.com/zhoumhan_0351/blog/static/39954227201061045630711/
【3】 好文
http://www.360doc.com/content/11/0720/15/379588_134716249.shtml
【4】 講解也比較清晰
http://www.xxlinux.com/linux/article/development/shell/2006-10-16/5018.html