Linux 中三種標(biāo)準(zhǔn)輸入輸出熬丧,分別是STDIN
笋粟,STDOUT
,STDERR
锹引,對應(yīng)的數(shù)字是0
矗钟,1
,2
嫌变。
-
STDIN
就是標(biāo)準(zhǔn)輸入吨艇,默認(rèn)從鍵盤讀取信息; -
STDOUT
是標(biāo)準(zhǔn)輸出腾啥,默認(rèn)將輸出結(jié)果輸出至終端东涡,也就是顯示器之類的東西; -
STDERR
是標(biāo)準(zhǔn)的錯誤信息倘待,默認(rèn)也會顯示在終端上疮跑。
由于STDOUT
與STDERR
都會默認(rèn)顯示在終端上,為了區(qū)分二者的信息凸舵,就有了編號的0
祖娘,1
,2
的定義啊奄,用1
表示STDOUT
渐苏,2
表示STDERR
掀潮。
-
從command>/dev/null說起
- 其實這條命令是一個縮寫版,對于一個重定向命令琼富,肯定是a > b這種形式仪吧,那么command > /dev/null難道是command充當(dāng)a的角色,/dev/null充當(dāng)b的角色鞠眉。這樣看起來比較合理薯鼠,其實一條命令肯定是充當(dāng)不了a,肯定是command執(zhí)行產(chǎn)生的輸出來充當(dāng)a械蹋,其實就是標(biāo)準(zhǔn)輸出stdout出皇。所以command > /dev/null相當(dāng)于執(zhí)行了command 1 > /dev/null。執(zhí)行command產(chǎn)生了標(biāo)準(zhǔn)輸出stdout(用1表示)朝蜘,重定向到/dev/null的設(shè)備文件中恶迈。
-
說說2>&1
- 通過上面command > /dev/null等價于command 1 > /dev/null,那么對于2>&1也就好理解了,2就是標(biāo)準(zhǔn)錯誤谱醇,1是標(biāo)準(zhǔn)輸出暇仲,那么這條命令不就是相當(dāng)于把標(biāo)準(zhǔn)錯誤重定向到標(biāo)準(zhǔn)輸出么。等等是&1而不是1副渴,這里&是什么奈附?這里&相當(dāng)于等效于標(biāo)準(zhǔn)輸出。這里有點(diǎn)不好理解煮剧,先看下面斥滤。
-
command>a 2>a 與 command>a 2>&1的區(qū)別
- 通過上面的分析,對于command>a 2>&1這條命令勉盅,等價于command 1>a 2>&1可以理解為執(zhí)行command產(chǎn)生的標(biāo)準(zhǔn)輸入重定向到文件a中佑颇,標(biāo)準(zhǔn)錯誤也重定向到文件a中。那么是否就說command 1>a 2>&1等價于command 1>a 2>a呢草娜。其實不是挑胸,command 1>a 2>&1與command 1>a 2>a還是有區(qū)別的,區(qū)別就在于前者只打開一次文件a宰闰,后者會打開文件兩次茬贵,并導(dǎo)致stdout被stderr覆蓋。&1的含義就可以理解為用標(biāo)準(zhǔn)輸出的引用移袍,引用的就是重定向標(biāo)準(zhǔn)輸出產(chǎn)生打開的a解藻。從IO效率上來講,command 1>a 2>&1比command 1>a 2>a的效率更高葡盗。