shell中可能經(jīng)常能看到:[>/dev/null 2>&1]
命令的結(jié)果可以通過%>的形式來定義輸出
分解這個(gè)組合:“>/dev/null 2>&1” 為五部分音瓷。
1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt
2:/dev/null 代表空設(shè)備文件
3:2> 表示stderr標(biāo)準(zhǔn)錯(cuò)誤
4:& 表示等同于的意思闰非,2>&1蒲祈,表示2的輸出重定向等同于1
5:1 表示stdout標(biāo)準(zhǔn)輸出,系統(tǒng)默認(rèn)值是1萝嘁,所以">/dev/null"等同于 "1>/dev/null"
因此梆掸,>[/dev/null 2>&1]
那么本文標(biāo)題的語句執(zhí)行過程為:
1>/dev/null :首先表示標(biāo)準(zhǔn)輸出重定向到空設(shè)備文件,也就是不輸出任何信息到終端牙言,說白了就是不顯示任何信息酸钦。
2>&1 :接著,標(biāo)準(zhǔn)錯(cuò)誤輸出重定向 到 標(biāo)準(zhǔn)輸出咱枉,因?yàn)橹皹?biāo)準(zhǔn)輸出已經(jīng)重定向到了空設(shè)備文件卑硫,所以標(biāo)準(zhǔn)錯(cuò)誤輸出也重定向到空設(shè)備文件。
最常用的方式有:
command > file 2>file 與command > file 2>&1
它們有什么不同的地方嗎蚕断?
首先command > file 2>file 的意思是將命令所產(chǎn)生的標(biāo)準(zhǔn)輸出信息,和錯(cuò)誤的輸出信息送到file 中.command > file 2>file 這樣的寫法,stdout和stderr都直接送到file中, file會(huì)被打開兩次,這樣stdout和stderr會(huì)互相覆蓋,這樣寫相當(dāng)使用了FD1和FD2兩個(gè)同時(shí)去搶占file 的管道欢伏。
而command >file 2>&1 這條命令就將stdout直接送向file, stderr 繼承了FD1管道后,再被送往file,此時(shí),file 只被打開了一次,也只使用了一個(gè)管道FD1,它包括了stdout和stderr的內(nèi)容。
從IO效率上,前一條命令的效率要比后面一條的命令效率要低,所以在編寫shell腳本的時(shí)候,較多的時(shí)候我們會(huì)command > file 2>&1 這樣的寫法亿乳。
那么再來說說nohup和&
nohup是永久執(zhí)行
&是指在后臺(tái)運(yùn)行
運(yùn)行 nohup --help
Run COMMAND, ignoring hangup signals. 可以看到是“運(yùn)行命令硝拧,忽略掛起信號(hào)”
就是指径筏,用nohup運(yùn)行命令可以使命令永久的執(zhí)行下去,和用戶終端沒有關(guān)系障陶,例如我們斷開SSH連接都不會(huì)影響他的運(yùn)行滋恬,注意了nohup沒有后臺(tái)運(yùn)行的意思;&才是后臺(tái)運(yùn)行
&是指在后臺(tái)運(yùn)行抱究,但當(dāng)用戶推出(掛起)的時(shí)候恢氯,命令自動(dòng)也跟著退出
那么,我們可以巧妙的吧他們結(jié)合起來用就是
nohup COMMAND &
這樣就能使命令永久的在后臺(tái)執(zhí)行
另外鼓寺,nohup執(zhí)行后勋拟,會(huì)產(chǎn)生日志文件,把命令的執(zhí)行中的消息保存到這個(gè)文件中侄刽,一般在當(dāng)前目錄下指黎,如果當(dāng)前目錄不可寫,那么自動(dòng)保存到執(zhí)行這個(gè)命令的用戶的home目錄下州丹,例如root的話就保存在/root/下