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