0 标准输入 1 标准输出 2 标准错误输出 &等同 引自:http://bbs.chinaunix.net/thread-191375-1-1.html $ 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
這樣,不就皆大歡喜了嗎? 呵~~~ ^_^
|