- 论坛徽章:
- 1
|
[转载]常用文件重定向命令
okay,又到講古時間~~~
當你搞懂了 0< 原來就是改變 stdin 的數據輸入通道之後,相信要理解如下兩個 redirection 就不難了:
* 1>
* 2>
前者是改變 stdout 的數據輸出通道,後者是改變 stderr 的數據輸出通道。
兩者都是將原本要送出到 monitor 的數據轉向輸出到指定檔案去。
由於 1 是 > 的預設值,因此,1> 與 > 是相同的,都是改 stdout 。
用上次的 ls 例子來說明一下好了:
$ ls my.file no.such.file 1>file.out
ls: no.such.file: No such file or directory
這樣 monitor 就只剩下 stderr 而已。因為 stdout 給寫進 file.out 去了。
$ ls my.file no.such.file 2>file.err
my.file
這樣 monitor 就只剩下 stdout ,因為 stderr 寫進了 file.err 。
$ ls my.file no.such.file 1>file.out 2>file.err
這樣 monitor 就啥也沒有,因為 stdout 與 stderr 都給轉到檔案去了...
呵~~~ 看來要理解 > 一點也不難啦﹗是不?沒騙你吧? ^_^
不過,有些地方還是要注意一下的。
首先,是 file locking 的問題。比方如下這個例子:
$ ls my.file no.such.file 1>file.both 2>file.both
從 file system 的角度來說,單一檔案在單一時間內,只能被單一的 FD 作寫入。
假如 stdout(1) 與 stderr(2) 都同時在寫入 file.both 的話,
則要看它們在寫入時否碰到同時競爭的情形了,基本上是"先搶先贏"的原則。
讓我們用周星馳式的"慢鏡頭"來看一下 stdout 與 stderr 同時寫入 file.out 的情形好了:
* 第 1, 2, 3 秒為 stdout 寫入
* 第 3, 4, 5 秒為 stderr 寫入
那麼,這時候 stderr 的第 3 秒所寫的數據就丟失掉了﹗
要是我們能控制 stderr 必須等 stdout 寫完再寫,或倒過來,stdout 等 stderr 寫完再寫,那問題就能解決。
但從技術上,較難掌控的,尤其是 FD 在作"長期性"的寫入時...
那,如何解決呢?所謂山不轉路轉、路不轉人轉嘛,
我們可以換一個思維:將 stderr 導進 stdout 或將 stdout 導進 sterr ,而不是大家在搶同一份檔案,不就行了﹗
bingo﹗就是這樣啦:
* 2>&1 就是將 stderr 併進 stdout 作輸出
* 1>&2 或 >&2 就是將 stdout 併進 stderr 作輸出
於是,前面的錯誤操作可以改為:
$ ls my.file no.such.file 1>file.both 2>&1
或
$ ls my.file no.such.file 2>file.both >&2
這樣,不就皆大歡喜了嗎? 呵~~~ ^_^
不過,光解決了 locking 的問題還不夠,我們還有其他技巧需要了解的。
故事還沒結束,別走開﹗廣告後,我們再回來...﹗ |
|