Posted on 2009-06-05 20:50
Prayer 閱讀(255)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Shell
在POSIX shell中,命令的結(jié)果可以通過(guò)%>;的形式來(lái)定義(其中%表示文件描述符:1為標(biāo)準(zhǔn)輸出stdout、2為標(biāo)準(zhǔn)錯(cuò)誤stderr)!系統(tǒng)默認(rèn)%值是1,也就是1>;,而1>;可以簡(jiǎn)寫為>;,也就是默認(rèn)為>;。而stdout的默認(rèn)目標(biāo)是終端(這點(diǎn)不用驗(yàn)證吧)。另外,stderr的默認(rèn)目標(biāo)我個(gè)人認(rèn)為也是終端,比如: #abcddcba sh: abcddcba: not found. 錯(cuò)誤信息顯示在終端上(對(duì)于telnet、dtterm等,那就說(shuō)虛擬終端了)。
==============實(shí)驗(yàn)環(huán)境============== #mkdir redtest #cd redtest #mkdir a4 #touch a1 a2 a3
==============簡(jiǎn)單試驗(yàn)============== #ls >;redout.lst (等同于ls 1>;redout.lst,標(biāo)準(zhǔn)輸出重定向) 系統(tǒng)先執(zhí)行>;redout.lst,生成一個(gè)空文件,然后系統(tǒng)執(zhí)行l(wèi)s,再把結(jié)果重定向到redout.lst。這時(shí)在終端看不到任何信息,但是#more redout.lst可以看到a1、a2、a3、a4和redout.lst。 #./ourgame 2>;rederr.lst (標(biāo)準(zhǔn)錯(cuò)誤重定向) 因?yàn)橄到y(tǒng)找不到執(zhí)行腳本ourgame,產(chǎn)生錯(cuò)誤,但并不是顯示在終端上,而是把錯(cuò)誤信息重定向到了rederr.lst。 #more rederr.lst sh: ourgame: not found. ==============組合試驗(yàn)============== #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的作用是執(zhí)行以后產(chǎn)生標(biāo)準(zhǔn)輸出(echo)和標(biāo)準(zhǔn)錯(cuò)誤(cp) #chmod 755 conj 看看一下命令的結(jié)果: #./conj a1 //stdout a2 //stdout a3 //stdout cp: a4: is a directory. Need "-R" option.//stderr conj //stdout 再試試重定向的結(jié)果: (1)、輸出重定向到文件a1,終端上只能看到標(biāo)準(zhǔn)錯(cuò)誤: #./conj >;a1 #./conj 1>;a1 #more a1 a1 a2 a3 conj (2)、錯(cuò)誤重定向到文件a1,終端上只能看到標(biāo)準(zhǔn)輸出: #./conj 2>;a1 #more a1 cp: a4: is a directory. Need "-R" option. (3)、把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都重定向到a1,終端上看不到任何信息: #./conf >;a1 2>;&1 (等同于#./conf 1>;a1 2>;&1) #more a1 a1 a2 a3 cp: a4: is a directory. Need "-R" option. conj //其中&的意思,可以看成是“The same as”、“與...一樣”的意思。本例中就是2>;和1>;一樣,都輸出到a1中。 再看一個(gè)例子: #./conj 2>;&1 >;a1 同樣可以解釋為2>;和1>;一樣,但是這時(shí)1>;是系統(tǒng)默認(rèn)輸出到終端,所以標(biāo)準(zhǔn)錯(cuò)誤也輸出到終端;然后,系統(tǒng)把標(biāo)準(zhǔn)輸出重定向到文件a1。
記得unixpianpianMM有個(gè)問題: echo "Usage $0 -d" >;&2 那么可以解釋為echo "Usage $0 -d" 1>;&2 也就是把結(jié)果輸出到和標(biāo)準(zhǔn)錯(cuò)誤一樣;之前如果有定義標(biāo)準(zhǔn)錯(cuò)誤重定向到某log文件,那么標(biāo)準(zhǔn)輸出也重定向到這個(gè)log文件。
以上腳本在HP-UX11.00 L2000通過(guò)!所有定義、名詞均建立在本人的實(shí)踐和本人所了解的知識(shí)上,如有錯(cuò)誤,請(qǐng)指正,謝謝!!!
wangrujun 回復(fù)于:2002-11-23 09:39:08
經(jīng)典!
playboy 回復(fù)于:2003-03-03 20:11:39
Bourne和Korn shell中的重定向 從文件輸入 <file or 0<file 將標(biāo)準(zhǔn)輸出重定向?yàn)槲募?nbsp; >;file or 1>;file 將標(biāo)準(zhǔn)錯(cuò)誤重定向?yàn)槲募?nbsp; 2>;file 將標(biāo)準(zhǔn)輸出追加到文件 >;>;file 將標(biāo)準(zhǔn)錯(cuò)誤重定向?yàn)闃?biāo)準(zhǔn)輸入 2>;&1 將第一個(gè)命令的輸入作為第二個(gè)文件的輸入 cmd1|cmd2 將第一個(gè)文件即作為標(biāo)準(zhǔn)輸入也作為標(biāo)準(zhǔn)輸出 <>;file 關(guān)閉標(biāo)準(zhǔn)輸入 0<&- 關(guān)閉標(biāo)準(zhǔn)輸出 1>;&- 關(guān)閉標(biāo)準(zhǔn)錯(cuò)誤 2>;&-
uman 回復(fù)于:2003-03-05 01:30:05
"stderr的默認(rèn)目標(biāo)我個(gè)人認(rèn)為也是終端" 就是這樣的,而且是unbuffered.
yhuang95411 回復(fù)于:2004-03-04 02:27:55
:mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: 但是缺乏比如說(shuō) 2>;&3, 1>;&3, 3>;1&, 3>;&2 的解釋
誰(shuí)能補(bǔ)全???
wingger 回復(fù)于:2004-11-14 14:00:43
引用:#./conj 2>;&1 >;a1 同樣可以解釋為2>;和1>;一樣,但是這時(shí)1>;是系統(tǒng)默認(rèn)輸出到終端,所以標(biāo)準(zhǔn)錯(cuò)誤也輸出到終端;然后,系統(tǒng)把標(biāo)準(zhǔn)輸出重定向到文件a1。
記得unixpianpianMM有個(gè)問題: echo "Usage $0 -d" >;&2 那么可以解釋為echo "Usage $0 -d" 1>;&2 也就是把結(jié)果輸出到和標(biāo)準(zhǔn)錯(cuò)誤一樣;之前如果有定義標(biāo)準(zhǔn)錯(cuò)誤重定向到某log文件,那么標(biāo)準(zhǔn)輸出也重定向到這個(gè)log文件。
引用:原帖由 "網(wǎng)中人" 發(fā)表: $ ls my.file no.such.file 1>;file.both 2>;file.both 從 file system 的角度來(lái)說(shuō),單一檔案在單一時(shí)間內(nèi),只能被單一的 FD 作寫入。 假如 stdout(1) 與 stderr(2) 都同時(shí)在寫入 file.both 的話, 則要看它們?cè)趯懭霑r(shí)否碰到同時(shí)競(jìng)爭(zhēng)的情形了,基本上是"先搶先贏"的原則。 讓我們用周星馳式的"慢鏡頭"來(lái)看一下 stdout 與 stderr 同時(shí)寫入 file.out 的情形好了: * 第 1, 2, 3 秒為 stdout 寫入 * 第 3, 4, 5 秒為 stderr 寫入 那么,這時(shí)候 stderr 的第 3 秒所寫的數(shù)據(jù)就丟失掉了﹗ 要是我們能控制 stderr 必須等 stdout 寫完再寫,或倒過(guò)來(lái),stdout 等 stderr 寫完再寫,那問題就能解決。 但從技術(shù)上,較難掌控的,尤其是 FD 在作"長(zhǎng)期性"的寫入時(shí)...
那,如何解決呢?所謂山不轉(zhuǎn)路轉(zhuǎn)、路不轉(zhuǎn)人轉(zhuǎn)嘛, 我們可以換一個(gè)思維:將 stderr 導(dǎo)進(jìn) stdout 或?qū)?nbsp;stdout 導(dǎo)進(jìn) sterr ,而不是大家在搶同一份檔案,不就行了﹗ bingo﹗就是這樣啦:
* 2>;&1 就是將 stderr 并進(jìn) stdout 作輸出 * 1>;&2 或 >;&2 就是將 stdout 并進(jìn) stderr 作輸出
于是,前面的錯(cuò)誤操作可以改為:
$ ls my.file no.such.file 1>;file.both 2>;&1 或 $ ls my.file no.such.file 2>;file.both >;&2
這樣,不就皆大歡喜了嗎? 呵~~~ ^_^
wingger 回復(fù)于:2004-11-14 14:19:07
引用:原帖由 "yhuang95411" 發(fā)表: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: 但是缺乏比如說(shuō) 2>;&3, 1>;&3, 3>;1&, 3>;&2 的解釋
誰(shuí)能補(bǔ)全???
command <&m 把文件描述符m作為標(biāo)準(zhǔn)輸入 command >;&m 把標(biāo)準(zhǔn)輸出重定向到文件描述符m中 command <&- 關(guān)閉標(biāo)準(zhǔn)輸入
safirst 回復(fù)于:2005-07-29 20:28:01
全了!呵呵
lei8c8 回復(fù)于:2005-07-29 20:33:24
頂!
yjtech 回復(fù)于:2005-07-30 22:04:35
[URL=http://www.linky.com.cn]益久聯(lián)合網(wǎng):提供免費(fèi)網(wǎng)站鏈接,網(wǎng)站鏈接,鏈接網(wǎng),免費(fèi)鏈接網(wǎng),友情鏈接,網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)推廣[/URL] [URL=http://www.yecaomei.com]野草莓:文化休閑網(wǎng)站 文化,休閑[/URL] [URL=http://www.hiday.com.cn]www.hiday.com.cn[/URL] [URL=http://www.webusiness.cn]益久網(wǎng)贏:專業(yè)的網(wǎng)絡(luò)營(yíng)銷顧問服務(wù),為您提供一站式網(wǎng)絡(luò)營(yíng)銷顧問服務(wù)以及網(wǎng)站設(shè)計(jì)與網(wǎng)絡(luò)技術(shù)支持:網(wǎng)站制作,建站程序,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)推廣,網(wǎng)絡(luò)營(yíng)銷顧問服務(wù)[/URL] [URL=http://www.taodongdong.com]www.taodongdong.com[/URL]
想飛的青蛙 回復(fù)于:2005-08-31 19:15:27
暈!居然還有這樣的貼子!
yttlovezxx 回復(fù)于:2005-09-14 23:27:22
如果談到 I/O 重定向,就涉及到文件標(biāo)識(shí)符 (File Descriptor) 的概念, 在 Linux 系統(tǒng)中,系統(tǒng)為每一個(gè)打開的文件指定一個(gè)文件標(biāo)識(shí)符以便系統(tǒng)對(duì)文件進(jìn)行跟蹤,這里有些和C語(yǔ)言編程里的文件句柄相似,文件標(biāo)識(shí)符是一個(gè)數(shù)字,不同數(shù)字代表不同的含義,默認(rèn)情況下,系統(tǒng)占用了 3 個(gè),分別是0標(biāo)準(zhǔn)輸入(stdin),1 標(biāo)準(zhǔn)輸出 (stdout), 2 標(biāo)準(zhǔn)錯(cuò)誤 (stderr), 另外 3-9 是保留的標(biāo)識(shí)符,可以把這些標(biāo)識(shí)符指定成標(biāo)準(zhǔn)輸入,輸出或者錯(cuò)誤作為臨時(shí)連接。通常這樣可以解決很多復(fù)雜的重定向請(qǐng)求。 !
net_robber 回復(fù)于:2006-08-31 14:08:30
今天回頭補(bǔ)課#(:
欣雨塵香 回復(fù)于:2007-09-26 11:45:23
受益:)
shkjb 回復(fù)于:2007-09-27 16:38:06
頂!
冰冰河 回復(fù)于:2007-10-23 16:26:09
“The same as” 看到一種說(shuō)法是 重定向輸入操作符 (<) 復(fù)制操作符 (&) 不知道那種是正確的
liaosnet 回復(fù)于:2007-10-23 17:16:20
這個(gè)是不是該轉(zhuǎn)到SHELL里去哦?~
Guanqun 回復(fù)于:2008-06-16 16:51:31
http://qun.wp-host.cn/?p=92寫了點(diǎn)重定向的小結(jié),歡迎訪問,討論。
by325 回復(fù)于:2008-07-03 00:03:45
真是超強(qiáng)帖啊,受益了,謝謝樓主了
ourangdegushi 回復(fù)于:2008-08-07 23:30:52
悶在心里好久的問題,終于明了啦,萬(wàn)分感謝啊
clement1986 回復(fù)于:2008-12-24 10:43:10
其實(shí)一般用的時(shí)候就是形式上的把2>1&加在后面就行
prot 回復(fù)于:2009-02-27 10:57:31
MARK
noexcuse 回復(fù)于:2009-04-25 19:10:08
>;是怎么回事? 為什么我用ls >;a.txt的語(yǔ)句,在Solaris下根本就跑不通? thx
[ 本帖最后由 noexcuse 于 2009-4-25 19:12 編輯 ]
|
 |
原文鏈接:http://bbs.chinaunix.net/viewthread.php?tid=16361 轉(zhuǎn)載請(qǐng)注明作者名及原文出處
|