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
- 流、管道和重定向
- https://www.tldp.org/LDP/abs/html/io-redirection.html
- 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 |