我們?cè)趌inux下經(jīng)常會(huì)碰到:
nohup command>/dev/null 2>&1 &
這樣形式的命令。
我們把這條命令大概分解一下。
(1)首先,就是一個(gè)nohup表示當(dāng)前用戶(hù)和系統(tǒng)的會(huì)話下的進(jìn)程忽略響應(yīng)HUP消息,也就是不掛斷地運(yùn)行命令。
(2)& 符號(hào)是把該命令以后臺(tái)的job的形式運(yùn)行。
(3)那么就剩下command>/dev/null 2>&1,其中command>/dev/null較好理解,/dev/null表示一個(gè)空設(shè)備,就是把 command的執(zhí)行結(jié)果重定向到空設(shè)備中,說(shuō)白了就是不顯示任何信息。
(4)最后,2>&1又是什么含義?
2>&1 幾個(gè)基本符號(hào)及其含義
- /dev/null 表示空設(shè)備文件
- 0 表示stdin標(biāo)準(zhǔn)輸入
- 1 表示stdout標(biāo)準(zhǔn)輸出
- 2 表示stderr標(biāo)準(zhǔn)錯(cuò)誤
command > /dev/null相當(dāng)于執(zhí)行了command 1 > /dev/null。執(zhí)行command產(chǎn)生了標(biāo)準(zhǔn)輸出stdout(用1表示),重定向到/dev/null的設(shè)備文件中。
分析 2>&1
對(duì)于2>&1的理解,2就是標(biāo)準(zhǔn)錯(cuò)誤,1是標(biāo)準(zhǔn)輸出,那么這條命令不就是相當(dāng)于把標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出么?是的。
為什么是&1而不是1,這里& 符號(hào)是什么?& 符號(hào)可以理解為引用(reference)。&1 就是對(duì)標(biāo)準(zhǔn)輸出的引用。
command>a 2>a 與 command>a 2>&1的區(qū)別
通過(guò)上面的分析,對(duì)于command>a 2>&1這條命令,等價(jià)于command 1>a 2>&1。
可以理解為執(zhí)行command產(chǎn)生的標(biāo)準(zhǔn)輸入重定向到文件a中,標(biāo)準(zhǔn)錯(cuò)誤也重定向到文件a中。
那么是否就說(shuō)command 1>a 2>&1等價(jià)于command 1>a 2>a呢?
其實(shí)不是,command 1>a 2>&1與command 1>a 2>a 還是有區(qū)別的,區(qū)別就在于前者只打開(kāi)一次文件a,后者會(huì)打開(kāi)文件兩次,并導(dǎo)致stdout被stderr覆蓋。&1的含義就可以理解為用標(biāo)準(zhǔn)輸出的引用,引用的就是重定向標(biāo)準(zhǔn)輸出產(chǎn)生打開(kāi)的a。從IO效率上來(lái)講,command 1>a 2>&1比 command 1>a 2>a的效率更高。
演示一下效果
//test.sh shell 程序
#!/bin/sh
t
date
其中t指令并不存在,執(zhí)行會(huì)報(bào)錯(cuò),會(huì)輸出到stderr。date能正常執(zhí)行,執(zhí)行會(huì)輸出當(dāng)前時(shí)間,會(huì)輸出到stdout。
chmod +x test.sh為test.sh增加執(zhí)行權(quán)限。
執(zhí)行 ./test.sh > test.log,如下所示:
我們發(fā)現(xiàn) stderr 并沒(méi)有被重定向到 test.log 中,stderr 直接輸出到屏幕上了。
執(zhí)行 ./test.sh > test.log 2>&1,如下所示:
這次,我們發(fā)現(xiàn)stdout 和 stderr 都被重定向到了 test.log 中了。
原文鏈接:
https://blog.csdn.net/ggxiaobai/article/details/53507530