[轉]重定向輸出

原文:https://blog.csdn.net/ggxiaobai/article/details/53507530 java

咱們在Linux下常常會碰到nohup command>/dev/null 2>&1 &這樣形式的命令。首先咱們把這條命令大概分解下首先就是一個nohup表示當前用戶和系統的回話下的進城忽略響應HUP消息。&是把該命令之後臺的job的形式運行。那麼就剩下command>/dev/null 2>&1,command>/dev/null較好理解,/dev/null表示一個空設備,就是說吧command的執行結果重定向到空設備中,說白了就是不顯示任何信息。那麼2>&1又是什麼含義?.net

2>&1
幾個基本符號及其含義
/dev/null 表示空設備文件
0 表示stdin標準輸入
1 表示stdout標準輸出
2 表示stderr標準錯誤
從command>/dev/null提及
其實這條命令是一個縮寫版,對於一個重定向命令,確定是a > b這種形式,那麼command > /dev/null難道是command充當a的角色,/dev/null充當b的角色。這樣看起來比較合理,其實一條命令確定是充當不了a,確定是command執行產生的輸出來充當a,其實就是標準輸出stdout。因此command > /dev/null至關於執行了command 1 > /dev/null。執行command產生了標準輸出stdout(用1表示),重定向到/dev/null的設備文件中。code

說說2>&1
經過上面command > /dev/null等價於command 1 > /dev/null,那麼對於2>&1也就好理解了,2就是標準錯誤,1是標準輸出,那麼這條命令不就是至關於把標準錯誤重定向到標準輸出麼。等等是&1而不是1,這裏&是什麼?這裏&至關於等效於標準輸出。這裏有點很差理解,先看下面。blog

command>a 2>a 與 command>a 2>&1的區別
經過上面的分析,對於command>a 2>&1這條命令,等價於command 1>a 2>&1能夠理解爲執行command產生的標準輸入重定向到文件a中,標準錯誤也重定向到文件a中。那麼是否就說command 1>a 2>&1等價於command 1>a 2>a呢。其實不是,command 1>a 2>&1與command 1>a 2>a仍是有區別的,區別就在於前者只打開一次文件a,後者會打開文件兩次,並致使stdout被stderr覆蓋。&1的含義就能夠理解爲用標準輸出的引用,引用的就是重定向標準輸出產生打開的a。從IO效率上來說,command 1>a 2>&1比command 1>a 2>a的效率更高。

class

nohup結合效率

咱們常用nohup command &命令形式來啓動一些後臺程序,好比一些java服務:後臺

nohup java -jar xxxx.jar &nohup java -jar xxxx.jar &引用

爲了避免讓一些執行信息輸出到前臺(控制檯),咱們還會加上剛纔提到的>/dev/null 2>&1命令來丟棄全部的輸出:程序

# nohup java -jar xxxx.jar >/dev/null 2>&1 &command

相關文章
相關標籤/搜索