• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            詳解重定向1>&2和2>&1

            大家在剛開始學(xué)SHELL的時候,可能對1>&2和2>&1,&2,是什么意思可能不是很清楚,下面的文章希望對大家有幫助

            說到 I/O redirection ,讓我們先來認(rèn)識一下 File Descriptor (FD) 。 

            程式的咚悖詿蟛糠萸闆r下都是進行數(shù)據(jù)(data)的處理, 
            這些數(shù)據(jù)從哪讀進?又,送出到哪裡呢? 
            這就是 file descriptor (FD) 的功用了。 

            在 shell 程式中,最常使用的 FD 大概有三個,分別為: 
            0: Standard Input (STDIN) 
            1: Standard Output (STDOUT) 
            2: Standard Error Output (STDERR) 

            在標(biāo)準(zhǔn)情況下,這些 FD 分別跟如下設(shè)備(device)關(guān)聯(lián): 
            stdin(0): keyboard 
            stdout(1): monitor 
            stderr(2): monitor 


            * 1>; 
            * 2>; 
            前者是改變 stdout 的數(shù)據(jù)輸出通道,後者是改變 stderr 的數(shù)據(jù)輸出通道。 
            兩者都是將原本要送出到 monitor 的數(shù)據(jù)轉(zhuǎn)向輸出到指定檔案去。 
            由於 1 是 >; 的預(yù)設(shè)值,因此,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 都給轉(zhuǎn)到檔案去了... 

            呵~~~ 看來要理解 >; 一點也不難啦﹗是不?沒騙你吧? ^_^ 
            不過,有些地方還是要注意一下的。 
            首先,是 file locking 的問題。比方如下這個例子:

            $ ls my.file no.such.file 1>;file.both 2>;file.both
            從 file system 的角度來說,單一檔案在單一時間內(nèi),只能被單一的 FD 作寫入。 
            假如 stdout(1) 與 stderr(2) 都同時在寫入 file.both 的話, 
            則要看它們在寫入時否碰到同時競爭的情形了,基本上是"先搶先贏"的原則。 
            讓我們用周星馳式的"慢鏡頭"來看一下 stdout 與 stderr 同時寫入 file.out 的情形好了: 
            * 第 1, 2, 3 秒為 stdout 寫入 
            * 第 3, 4, 5 秒為 stderr 寫入 
            那麼,這時候 stderr 的第 3 秒所寫的數(shù)據(jù)就丟失掉了﹗ 
            要是我們能控制 stderr 必須等 stdout 寫完再寫,或倒過來,stdout 等 stderr 寫完再寫,那問題就能解決。 
            但從技術(shù)上,較難掌控的,尤其是 FD 在作"長期性"的寫入時... 

            那,如何解決呢?所謂山不轉(zhuǎn)路轉(zhuǎn)、路不轉(zhuǎn)人轉(zhuǎn)嘛, 
            我們可以換一個思維:將 stderr 導(dǎo)進 stdout 或?qū)?stdout 導(dǎo)進 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

            posted on 2011-01-02 00:49 大龍 閱讀(559) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            亚洲狠狠婷婷综合久久蜜芽 | 亚洲国产精品久久久久婷婷老年| 精品蜜臀久久久久99网站| 国产精品久久成人影院| 国产精品九九久久免费视频| 久久天天躁狠狠躁夜夜躁2014| 亚洲AV无码一区东京热久久| 狠狠色综合网站久久久久久久| 国内精品伊人久久久影院| 嫩草影院久久99| 久久国产免费直播| 久久精品视屏| 久久亚洲国产中v天仙www| 情人伊人久久综合亚洲| 亚洲国产精品久久久天堂| 亚洲国产成人久久精品影视| 久久国产欧美日韩精品免费| 亚洲综合精品香蕉久久网97| 五月丁香综合激情六月久久| 久久免费香蕉视频| 99久久精品免费看国产一区二区三区| 偷偷做久久久久网站| 色婷婷噜噜久久国产精品12p| 91性高湖久久久久| 久久福利青草精品资源站免费| 欧洲精品久久久av无码电影 | 99re久久精品国产首页2020| 777午夜精品久久av蜜臀| 久久这里都是精品| 婷婷久久精品国产| 一本色综合久久| 久久99热这里只频精品6| 欧美日韩精品久久久久| 久久综合久久伊人| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久久久亚洲AV成人片| 亚洲伊人久久成综合人影院| 亚洲精品tv久久久久久久久久| 亚洲国产天堂久久综合| 77777亚洲午夜久久多喷| 日日噜噜夜夜狠狠久久丁香五月|