• <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>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            關于>&2、2>&1等重定向的詳細解釋

            Posted on 2009-06-05 20:50 Prayer 閱讀(255) 評論(0)  編輯 收藏 引用 所屬分類: Shell
            在POSIX shell中,命令的結果可以通過%>;的形式來定義(其中%表示文件描述符:1為標準輸出stdout、2為標準錯誤stderr)!系統默認%值是1,也就是1>;,而1>;可以簡寫為>;,也就是默認為>;。而stdout的默認目標是終端(這點不用驗證吧)。另外,stderr的默認目標我個人認為也是終端,比如:
            #abcddcba
            sh: abcddcba: not found.
            錯誤信息顯示在終端上(對于telnet、dtterm等,那就說虛擬終端了)。

            ==============實驗環境==============
            #mkdir redtest
            #cd redtest
            #mkdir a4
            #touch a1 a2 a3 

            ==============簡單試驗==============
            #ls >;redout.lst (等同于ls 1>;redout.lst,標準輸出重定向)
            系統先執行>;redout.lst,生成一個空文件,然后系統執行ls,再把結果重定向到redout.lst。這時在終端看不到任何信息,但是#more redout.lst可以看到a1、a2、a3、a4和redout.lst。
            #./ourgame 2>;rederr.lst (標準錯誤重定向)
            因為系統找不到執行腳本ourgame,產生錯誤,但并不是顯示在終端上,而是把錯誤信息重定向到了rederr.lst。
            #more rederr.lst
            sh: ourgame: not found.
            ==============組合試驗==============
            #rm rederr.lst
            #rm redout.lst
            #vi conj
            #!/usr/bin/sh
            #Email:webmaster@myhpux.com
            for FN in `ls`
            do
            if [[ -f $FN ]]
            then
            echo $FN
            else
            cp $FN $FN.new
            fi
            done
            //conj的作用是執行以后產生標準輸出(echo)和標準錯誤(cp)
            #chmod 755 conj
            看看一下命令的結果:
            #./conj 
            a1 //stdout
            a2 //stdout
            a3 //stdout
            cp: a4: is a directory. Need &quot;-R&quot; option.//stderr
            conj //stdout
            再試試重定向的結果:
            (1)、輸出重定向到文件a1,終端上只能看到標準錯誤:
            #./conj >;a1
            #./conj 1>;a1
            #more a1 
            a1
            a2
            a3
            conj
            (2)、錯誤重定向到文件a1,終端上只能看到標準輸出:
            #./conj 2>;a1
            #more a1
            cp: a4: is a directory. Need &quot;-R&quot; option.
            (3)、把標準輸出和標準錯誤都重定向到a1,終端上看不到任何信息:
            #./conf >;a1 2>;&amp;1 (等同于#./conf 1>;a1 2>;&amp;1)
            #more a1
            a1
            a2
            a3
            cp: a4: is a directory. Need &quot;-R&quot; option.
            conj
            //其中&amp;的意思,可以看成是“The same as”、“與...一樣”的意思。本例中就是2>;和1>;一樣,都輸出到a1中。
            再看一個例子:
            #./conj 2>;&amp;1 >;a1
            同樣可以解釋為2>;和1>;一樣,但是這時1>;是系統默認輸出到終端,所以標準錯誤也輸出到終端;然后,系統把標準輸出重定向到文件a1。

            記得unixpianpianMM有個問題:
            echo &quot;Usage $0 -d&quot; >;&amp;2
            那么可以解釋為echo &quot;Usage $0 -d&quot; 1>;&amp;2
            也就是把結果輸出到和標準錯誤一樣;之前如果有定義標準錯誤重定向到某log文件,那么標準輸出也重定向到這個log文件。

            以上腳本在HP-UX11.00 L2000通過!所有定義、名詞均建立在本人的實踐和本人所了解的知識上,如有錯誤,請指正,謝謝?。?!





             wangrujun 回復于:2002-11-23 09:39:08

            經典!


             playboy 回復于:2003-03-03 20:11:39

            Bourne和Korn shell中的重定向
            從文件輸入                                                       <file or 0<file
            將標準輸出重定向為文件                                    >;file or 1>;file
            將標準錯誤重定向為文件                                     2>;file
            將標準輸出追加到文件                                        >;>;file
            將標準錯誤重定向為標準輸入                              2>;&amp;1
            將第一個命令的輸入作為第二個文件的輸入          cmd1|cmd2
            將第一個文件即作為標準輸入也作為標準輸出       <>;file
            關閉標準輸入                                                    0<&amp;-
            關閉標準輸出                                                    1>;&amp;-
            關閉標準錯誤                                                    2>;&amp;-


             uman 回復于:2003-03-05 01:30:05

            "stderr的默認目標我個人認為也是終端"
            就是這樣的,而且是unbuffered.


             yhuang95411 回復于:2004-03-04 02:27:55

            :mrgreen:  :mrgreen:  :mrgreen:  :mrgreen:  :mrgreen: 
            但是缺乏比如說
            2>;&3, 1>;&3, 3>;1&, 3>;&2
            的解釋

            誰能補全???


             wingger 回復于:2004-11-14 14:00:43

            引用:#./conj 2>;&1 >;a1 
            同樣可以解釋為2>;和1>;一樣,但是這時1>;是系統默認輸出到終端,所以標準錯誤也輸出到終端;然后,系統把標準輸出重定向到文件a1。 

            記得unixpianpianMM有個問題: 
            echo "Usage $0 -d" >;&2 
            那么可以解釋為echo "Usage $0 -d" 1>;&2 
            也就是把結果輸出到和標準錯誤一樣;之前如果有定義標準錯誤重定向到某log文件,那么標準輸出也重定向到這個log文件。

             

            引用:原帖由 "網中人" 發表:
            $
             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
             

            這樣,不就皆大歡喜了嗎? 呵~~~ ^_^



             wingger 回復于:2004-11-14 14:19:07

            引用:原帖由 "yhuang95411" 發表:
            :mrgreen:  :mrgreen:  :mrgreen:  :mrgreen:  :mrgreen: 
            但是缺乏比如說
            2>;&3, 1>;&3, 3>;1&, 3>;&2
            的解釋

            誰能補全???




            command <&m 把文件描述符m作為標準輸入 
            command >;&m 把標準輸出重定向到文件描述符m中 
            command <&- 關閉標準輸入


             safirst 回復于:2005-07-29 20:28:01

            全了!呵呵


             lei8c8 回復于:2005-07-29 20:33:24

            頂!


             yjtech 回復于:2005-07-30 22:04:35

            [URL=http://www.linky.com.cn]益久聯合網:提供免費網站鏈接,網站鏈接,鏈接網,免費鏈接網,友情鏈接,網絡營銷,網絡推廣[/URL]
            [URL=http://www.yecaomei.com]野草莓:文化休閑網站 文化,休閑[/URL]
            [URL=http://www.hiday.com.cn]www.hiday.com.cn[/URL]
            [URL=http://www.webusiness.cn]益久網贏:專業的網絡營銷顧問服務,為您提供一站式網絡營銷顧問服務以及網站設計與網絡技術支持:網站制作,建站程序,網頁設計,網絡營銷,網絡推廣,網絡營銷顧問服務[/URL]
            [URL=http://www.taodongdong.com]www.taodongdong.com[/URL]


             想飛的青蛙 回復于:2005-08-31 19:15:27

            暈!居然還有這樣的貼子!


             yttlovezxx 回復于:2005-09-14 23:27:22

            如果談到 I/O 重定向,就涉及到文件標識符 (File Descriptor) 的概念, 在 Linux 系統中,系統為每一個打開的文件指定一個文件標識符以便系統對文件進行跟蹤,這里有些和C語言編程里的文件句柄相似,文件標識符是一個數字,不同數字代表不同的含義,默認情況下,系統占用了 3 個,分別是0標準輸入(stdin),1 標準輸出 (stdout), 2 標準錯誤 (stderr), 另外 3-9 是保留的標識符,可以把這些標識符指定成標準輸入,輸出或者錯誤作為臨時連接。通常這樣可以解決很多復雜的重定向請求。
            !


             net_robber 回復于:2006-08-31 14:08:30

            今天回頭補課#(:


             欣雨塵香 回復于:2007-09-26 11:45:23

            受益:)


             shkjb 回復于:2007-09-27 16:38:06

            頂!


             冰冰河 回復于:2007-10-23 16:26:09

            “The same as”   看到一種說法是 重定向輸入操作符 (<)  復制操作符 (&)  不知道那種是正確的


             liaosnet 回復于:2007-10-23 17:16:20

            這個是不是該轉到SHELL里去哦?~


             Guanqun 回復于:2008-06-16 16:51:31

            http://qun.wp-host.cn/?p=92寫了點重定向的小結,歡迎訪問,討論。


             by325 回復于:2008-07-03 00:03:45

            真是超強帖啊,受益了,謝謝樓主了


             ourangdegushi 回復于:2008-08-07 23:30:52

            悶在心里好久的問題,終于明了啦,萬分感謝啊


             clement1986 回復于:2008-12-24 10:43:10

            其實一般用的時候就是形式上的把2>1&加在后面就行


             prot 回復于:2009-02-27 10:57:31

            MARK


             noexcuse 回復于:2009-04-25 19:10:08

            >;是怎么回事?
            為什么我用ls >;a.txt的語句,在Solaris下根本就跑不通?
            thx

            [ 本帖最后由 noexcuse 于 2009-4-25 19:12 編輯 ]




            原文鏈接:http://bbs.chinaunix.net/viewthread.php?tid=16361
            轉載請注明作者名及原文出處
            久久丫忘忧草产品| 久久影视国产亚洲| 久久人人爽人人爽人人AV| 狠狠色综合网站久久久久久久高清| 久久午夜福利无码1000合集| 日日噜噜夜夜狠狠久久丁香五月| 久久久久久久97| 久久se精品一区二区影院| 久久AV高潮AV无码AV| 色综合久久精品中文字幕首页| 久久久久无码中| 精品久久久久久亚洲| 欧美久久综合九色综合| 99国产欧美久久久精品蜜芽| 久久国产精品一区| 国产美女久久精品香蕉69| 欧美麻豆久久久久久中文| 国内精品久久久久| 一本色道久久88—综合亚洲精品| 久久er国产精品免费观看2| 国产精品久久久久久久久软件| 亚洲一区二区三区日本久久九| 久久人人爽人人爽人人av东京热 | 久久伊人精品青青草原高清| 亚洲午夜无码AV毛片久久| 夜夜亚洲天天久久| 久久久久高潮毛片免费全部播放| 色综合合久久天天给综看| 国产亚州精品女人久久久久久| 久久九九精品99国产精品| 亚洲а∨天堂久久精品| 亚洲国产精品久久久久网站| 狠狠久久亚洲欧美专区| 久久国产精品99国产精| 性欧美大战久久久久久久久| 狠狠色综合网站久久久久久久高清| 久久久免费观成人影院| 久久久久无码国产精品不卡| 日日狠狠久久偷偷色综合免费 | 99久久亚洲综合精品网站| 国产三级久久久精品麻豆三级|