我們經常會在Unix系統下的一些腳本中看到類似”2>&1″這樣的用法,例如“/path/to/prog 2>&1 > /dev/null &”,那麼它的具體含義是什麼呢?
Unix系統有幾種輸入輸出流,它們分別與幾個數字有如下的對應關系:0-標准輸入流(stdin),1-標准輸出流(stdout),2-標准錯誤流 (stderr)。
"2>&1"的意思就是將stderr重定向至stdout,並一起在屏幕上顯示出來。如果不加數字,那麼默認的Unix系統重定向動作是針對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並未被清除,因此仍將在屏幕中顯示出來;第二條命令無輸出,因為當Unix系統 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中將沒有信息。
在Unix系統中,數據流重定向問題,我們就講解到這裡了。