Bash的輸入輸出重定向

此頁由 Linux Wiki用戶Chenych11 於 2013年12月17日 (星期二) 13:39 的最後更改。 在linuxCook和Linux Wiki用戶Chenxing的工作基礎上。

出自Linux Wiki

提示:此文已超过 10 年(3753 天)未更新,如发现内容过时或有误,欢迎改进:)

使用Bash可以方便的用<和>實現輸出輸入的重定向,本文討論重定向的一些細節和技巧。本文介紹部分是對Bash Quick Reference相關內容的翻譯。

目錄

基礎知識

文件描述符(File Descriptor),是進程對其所打開文件的索引,形式上是個非負整數。類 Unix 系統中,常用的特殊文件描述符如下:

文件描述符 名稱 常用縮寫 默認值
0 標準輸入 stdin 鍵盤
1 標準輸出 stdout 屏幕
2 標準錯誤輸出 stderr 屏幕

我們在簡單地用 < > 時,相當於使用 0< 1> (下面會詳細介紹)。

管道 (“|”, pipe line),把上一個命令的 stdout 接到下一個命令的 stdin;

tee 命令的作用是在不影響原本 I/O 的情況下,將 stdout 複製一份到檔案去;

簡單重定向

  • cmd > file
把cmd命令的輸出重定向到文件file中。如果file已經存在,則清空原有文件,使用bash的noclobber選項可以防止覆蓋原有文件。
  • cmd >> file
把cmd命令的輸出重定向到文件file中,如果file已經存在,則把信息加在原有文件後面。
  • cmd < file
使cmd命令從file讀入
  • cmd << text
從命令行讀取輸入,直到一個與text相同的行結束。除非使用引號把輸入括起來,此模式將對輸入內容進行shell變量替換。如果使用 <<- ,則會忽略接下來輸入行首的tab,結束行也可以是一堆tab再加上一個與text相同的內容,可以參考後面的例子。
  • cmd <<< word
把word(而不是文件word)和後面的換行作為輸入提供給cmd。
  • cmd <> file
以讀寫模式把文件file重定向到輸入,文件file不會被破壞。僅當應用程序利用了這一特性時,它才是有意義的。
  • cmd >| file
功能同>,但即便在設置了noclobber時也會覆蓋file文件,注意用的是|而非一些書中說的!,目前僅在csh中仍沿用>!實現這一功能。

使用文件描述符的重定向

使用文件描述符的重定向都使用了&符號。

cmd >&n 把輸出送到文件描述符n
cmd m>&n 把輸出 到文件符m的信息重定向到文件描述符n
cmd >&- 關閉標準輸出
cmd <&n 輸入來自文件描述符n
cmd m<&n m來自文件描述符n
cmd <&- 關閉標準輸入
cmd <&n- 移動輸入文件描述符n而非複製它。(需要解釋)
cmd >&n- 移動輸出文件描述符 n而非複製它。(需要解釋)
Note.gif
注意:
>&實際上複製了文件描述符,這使得ls > dirlist 2>&1ls 2>&1 > dirlist的效果不一樣。man bash的Redirection節中提及了這段內容。

重定向的組合應用

cmd 2>file 把文件描述符2重定向到file,即把錯誤輸出存到file中。
cmd > file 2>&1 把標準錯誤重定向到標準輸出,再重定向到file,即stderr和stdout都被輸出到file中
cmd &> file 功能與上一個相同,更為簡便的寫法。
cmd >& file 功能仍與上一個相同。
cmd > f1 2>f2 把stdout重定向到f1,而把stderr重定向到f2
tee files 把stdout原樣輸出的同時,複製一份到files中。
tee files 把stderr和stdout都輸出到files中,同時輸出到屏幕。

重定向實例

Template:Bash重定向實例

類似重定向的功能

下面的一些用法並不屬於重定向的範疇,但和重定向較為類似。

進程替換

bash在某些系統中的特性,可以將輸入輸出轉到另一個程序中去,可以同時輸出個多個程序,使用方法是>(list)<(list),如[1]

wget -O - http://example.com/dvd.iso \
       | tee >(sha1sum > dvd.sha1) \
             >(md5sum > dvd.md5) \
       > dvd.iso

巧妙地同時完全了SHA-1MD5校驗工作。


參考資料

  1. tee invocation

本文对您有帮助?分享给更多朋友!

反馈与讨论

发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。
简体繁体转换