標籤:

20.7 輸入輸出重定向 (從新手到菜鳥的Linux教程)

原文重定向


這個是 shell 的(一部分)精髓吧 <del>所以我幾乎每次都會搞錯</del>

簡單說來就是通過一些保留的符號,操縱命令的輸入流、輸出流(包括標準輸出流和錯誤輸出流)。我們提到過 Unix/Linux 設計哲學是一切都是文件,所以一個命令(進程?)輸入、輸出都是「文件」;既然是文件那就可以進行重定向。

我們先從一個範例入手感性認識一下:

$ pwdn/tmp/demon$ pwd >output_filen$ lsnoutput_filen$ cat output_file n/tmp/demon

比較第一和第二條命令,第二次的輸出「消失了」,而是跑到了大於號後面文件名中。那麼這裡 > 就是一個重定向符。


一般我們能操縱的流有標準輸入流 0 ,標準輸出流 1 ,標準錯誤流 2 。重定向符也有 3 個,輸入重定向符 < ,覆蓋輸出重定向符 > ,追加輸出重定向符 >> 。需要注意的是上面提到的 012 是文件描述符,來歷比較複雜我也搞不清楚(爬走,參見 流、管道和重定向)。

這些符號的組合方法是:

[n]<word # 從文件 word 讀取作為輸入流到描述符[n],默認 n=0n[n]>word # 將描述符[n]的內容覆蓋輸出到文件 word,默認 n=1n[n]>>word # 將描述符[n]的內容追加輸出到文件 word,默認 n=1n&[n] # 表示描述符[n]此刻指向的文件,而不是保持引用n

對於最後一條,我們需要重點舉例:

command 2>&1 >output_file # 不是想要的結果!標準錯誤定向到了標準輸出!ncommand >output_file 2>&1 # 正確!標準錯誤一起輸出到了 output_filen

因此有一個更好的符號是 &>word ,這語義上與 >word 2>&1 等價。


注意:不要輕易使用 `>` !由於覆蓋操作會不經意間清空目標文件內容!


另一個需要簡短介紹的功能是 Heredoc ,大概模樣長這樣

command << delimitern contentndelimitern

最後一行的 delimiter 必須和第一行 heredoc 符號之後的分界符一模一樣,這樣才能夠結束 heredoc 。

<del>其實我也不經常用。</del>

Reference

- 流、管道和重定向

- tldp.org/LDP/abs/html/i

- Shell輸入輸出重定向:Shell Here Document,/dev/null文件

推薦閱讀:

【Bash On Windows】在 Windows Subsystem for Linux(WSL) 上運行任何桌面環境(已達可用階段)
20.4 Shell 字元串 (從新手到菜鳥的Linux教程)
20.5 Shell 條件表達式 (從新手到菜鳥的Linux教程)
linux刪除根目錄後發生了什麼?

TAG:Bash |