Bash的輸入輸出重定向
從 Linux Wiki
提示:此文已超过 11 年(4022 天)未更新,如发现内容过时或有误,欢迎改进:)
使用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而非複製它。(需要解釋) |
重定向的組合應用
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中,同時輸出到屏幕。 |
重定向實例
類似重定向的功能
下面的一些用法並不屬於重定向的範疇,但和重定向較為類似。
進程替換
bash在某些系統中的特性,可以將輸入輸出轉到另一個程序中去,可以同時輸出個多個程序,使用方法是>(list)或<(list),如[1]:
wget -O - http://example.com/dvd.iso \ | tee >(sha1sum > dvd.sha1) \ >(md5sum > dvd.md5) \ > dvd.iso
參考資料
- Bash Quick Reference(ISBN: 0596527764)
- http://blog.csdn.net/woso/archive/2007/04/04/1551790.aspx
- http://guocongbin.iblog.com/post/1964/467666
本文对您有帮助?分享给更多朋友!
反馈与讨论
发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。