我們經常會在UNIX系統下的一些腳本中看到類似”2>&1″這樣的用法,例如“/path/to/prog 2>&1 > /dev/null &”,那麼它的具體含義是什麼呢?
UNIX有幾種輸入輸出流,它們分別與幾個數字有如下的對應關系:
0-標准輸入流(stdin),1-標准輸出流(stdout),2-標准錯誤流 (stderr)。
"2>&1"的意思就是將stderr重定向至stdout,並一起在屏幕上顯示出來。如果不加數字,那麼默認的重定向動作是針對stdout(1)的,比如”ls -l > result”就等價於”ls -l 1 > result”。這樣便於我們更普遍性的理解重定向過程。
下面舉例說明:
#cat std.sh
#!/bin/sh
echo “stdout”
echo “stderr” >&2
#/bin/sh std.sh 2>&1 > /dev/null
stderr
#/bin/sh std.sh > /dev/null 2>&1
第一條命令的輸出結果是stderr,因為stdout和stderr合並後一同重定向到/dev/null,但stderr並未被清除,因此仍將在屏幕中顯示出來;第二條命令無輸出,因為當stdout重定向至/dev/null後,stderr又重定向到了stdout,這樣stderr也被輸出到了/dev/null。
/dev/null是什麼設備?
/dev/null是“垃圾黑洞”,所有無用的東西都可以寫到裡面區。舉個實例,你把一個文件move到/dev/null,那他就永遠消失了,就想掉進了黑洞裡。 並不是什麼具體的設備。一些不想現實的信息都可以重定向到/dev/null中。
通常用法: #/bin/sh std.sh > /dev/null 2>&1 把標准輸出了標准出錯都重定向到/dev/null,就是空設備,不現實出錯信息。 nohup sh std.sh>/dev/null 2>&1 &,此時nohup.out中將沒有信息。