天天看點

65、shell,輸入輸出重定向

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>

繼續閱讀