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】 總結不錯
<a href="http://hi.baidu.com/xxjyz/blog/item/59bbbb0394856d1c4bfb51ee.html">http://hi.baidu.com/xxjyz/blog/item/59bbbb0394856d1c4bfb51ee.html</a>
<a href="http://blog.163.com/zhoumhan_0351/blog/static/39954227201061045630711/">http://blog.163.com/zhoumhan_0351/blog/static/39954227201061045630711/</a>
【3】 好文
<a href="http://www.360doc.com/content/11/0720/15/379588_134716249.shtml">http://www.360doc.com/content/11/0720/15/379588_134716249.shtml</a>
【4】 講解也比較清晰
<a href="http://www.xxlinux.com/linux/article/development/shell/2006-10-16/5018.html">http://www.xxlinux.com/linux/article/development/shell/2006-10-16/5018.html</a>