默認情況下,總是有三個文件處于打開狀態(tài)钉答,標準輸入(鍵盤輸入)础芍、標準輸出(輸出到屏幕)、標準錯誤(也是輸出到屏幕)数尿,它們分別對應的文件描述符是0仑性,1,2 右蹦。那么我們來看看下面的幾種重定向方法的區(qū)別:
>/dev/null 2>&1
// ?實際上诊杆,應該等同于這樣: 1>/dev/null 2>/dev/null 歼捐,默認情況下就是1,標準輸出晨汹,所以一般都省略豹储。 而&符號,后面接的是必須的文件描述符宰缤。不能寫成2>1颂翼,這樣就成了標準錯誤重定向到文件名為1的文件中了晃洒,而不是重定向標準錯誤到標準輸出中慨灭。所以這里就是:標準輸出重定向到了/dev/null,而標準錯誤又重定向到了標準輸出球及,所以就成了標準輸出和標準錯誤都重定向到了/dev/null
2>&1 >/dev/null
// 咋一看氧骤,這個跟上面那個有啥區(qū)別呢,不也是標準錯誤重定向到標準輸出吃引,而標準輸出重定向到/dev/null么筹陵? 最后不應該都重定向/dev/null么? 我是這么理解的镊尺!一條指令同一時刻要么產(chǎn)生標準錯誤,要么產(chǎn)生標準輸出庐氮。 當產(chǎn)出標準錯誤的時候,因這個標準錯誤重定向到了標準輸出弄砍,而標準輸出是輸出到屏幕。這個時候標準輸出還沒有被重定向到/dev/null音婶,于是在屏幕上打印了慨畸。當產(chǎn)生標準輸出時,那么它就不是標準錯誤衣式,2>&1無效寸士,于是標準輸出重定向dev/null碴卧,不打印到屏幕。所以最終結果將是:標準錯誤打印到屏幕螟深,而標準輸出不打印到屏幕谐宙。
-------------
2016-01-22 更新
突然看到N年前的博客, 才發(fā)現(xiàn)錯誤百出.更新下, 以免誤人, 事實上, 命令行的重定向什么的, 是在執(zhí)行命令之前就準備好了的. 解釋順序從左至右依次進行, 2&>1 ,而1是屏幕, 所以標準錯誤重定向到屏幕, 再而 1>/dev/null , 即標準輸出重定向到 /dev/null, 上述2>&1 >/dev/null ?并不是什么同一時刻要么產(chǎn)生標準輸出要么產(chǎn)生標準錯誤. 而是兩個不同的東西.
以以下變量的方式做個解釋,就很明顯了界弧,這兩種方式是不同的凡蜻,前者就像:
a=1
b=a
而后者就像:
b=a
a=1
&>/dev/null
// 這個就是,不管你是啥玩意兒文件描述符划栓,通通重定向到/dev/null