日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Linux里的2>&1究竟是什么,這篇文章告訴你

 蘇醒的貝殼 2019-04-06

Linux里的2>&1究竟是什么,這篇文章告訴你

我們在Linux下經(jīng)常會碰到nohup command>/dev/ 2>&1 &這樣形式的命令。首先我們把這條命令大概分解下首先就是一個nohup命令可以在你退出帳戶之后繼續(xù)運(yùn)行相應(yīng)的進(jìn)程。nohup就是不掛起的意思( no hang up)。

&是把該命令以后臺的job的形式運(yùn)行。那么就剩下command>/dev/ 2>&1,command>/dev/較好理解,/dev/表示一個空設(shè)備,就是說吧command的執(zhí)行結(jié)果重定向到空設(shè)備中,說白了就是不顯示任何信息。那么2>&1又是什么含義?

2>&1幾個基本符號及其含義
  • >代表重定向到哪里,例如:echo “123”>/home/123.txt

  • /dev/ 表示空設(shè)備文件

  • 0 表示stdin標(biāo)準(zhǔn)輸入

  • 1 表示stdout標(biāo)準(zhǔn)輸出,系統(tǒng)默認(rèn)值是1,所以”>/dev/”等同于 “1>/dev/”

  • 2 表示stderr標(biāo)準(zhǔn)錯誤

從command>/dev/說起

其實這條命令是一個縮寫版,對于一個重定向命令,肯定是a > b這種形式,那么command > /dev/難道是command充當(dāng)a的角色,/dev/充當(dāng)b的角色。

這樣看起來比較合理,其實一條命令肯定是充當(dāng)不了a,肯定是command執(zhí)行產(chǎn)生的輸出來充當(dāng)a,其實就是標(biāo)準(zhǔn)輸出stdout。

所以command > /dev/相當(dāng)于執(zhí)行了command 1 > /dev/。執(zhí)行command產(chǎn)生了標(biāo)準(zhǔn)輸出stdout(用1表示),重定向到/dev/的設(shè)備文件中。

說說2>&1

通過上面command > /dev/等價于command 1 > /dev/,那么對于2>&1也就好理解了,2就是標(biāo)準(zhǔn)錯誤,1是標(biāo)準(zhǔn)輸出,那么這條命令不就是相當(dāng)于把標(biāo)準(zhǔn)錯誤重定向到標(biāo)準(zhǔn)輸出么。等等是&1而不是1,這里&是什么?對于& 1更準(zhǔn)確的說應(yīng)該是文件描述符 1,而1標(biāo)識標(biāo)準(zhǔn)輸出,stdout。這里&1相當(dāng)于等效于標(biāo)準(zhǔn)輸出>重定到標(biāo)準(zhǔn)輸出,這里標(biāo)準(zhǔn)輸出已經(jīng)重定向到了 /dev/。那么標(biāo)準(zhǔn)錯誤也會輸出到/dev/。

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>&1command 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>&1command 1>a 2>a的效率更高。

舉個栗子

#!/bin/sh t date

chmod +x test.sh為test.sh增加執(zhí)行權(quán)限。這里我們弄了兩條命令,其中t指令并不存在,執(zhí)行會報錯,會輸出到stderr。date能正常執(zhí)行,執(zhí)行會輸出當(dāng)前時間,會輸出到stdout。

執(zhí)行./test.sh > res1.log結(jié)果為 我們發(fā)現(xiàn)stderr并沒有被重定向到res1.log中,stderr被打印到了屏幕上。這也進(jìn)一步證明了上面說的./test.sh > res1.log等價于./test.sh 1>res1.log

執(zhí)行./test.sh>res2.log 2>&1結(jié)果為 這次我們發(fā)現(xiàn)stdout和stderr都被重定向到了res2.log中了。上面我們未對stderr也就是2說明如何輸出,stderr就輸出到了屏 幕上,這里我們不僅對stdout進(jìn)行說明,重定向到res2.log中,對標(biāo)準(zhǔn)錯誤也進(jìn)行了說明,讓其重定向到res2.log的引用即 res2.log的文件描述符中。

再思考一下

為何2>&1要寫在command>1的后面,直接用2可以么。比如ls 2>a。其實這種用法也是可以的,ls命令列出當(dāng)前的目錄,用stdout(1)表示,由于這個時候沒有stderr(2),這個時候執(zhí)行l(wèi)s 2>a也會正常產(chǎn)生一個a的文件,但是a的文件中是空的,因為這時候執(zhí)行l(wèi)s并沒有產(chǎn)生stderr(2)。

AIOps 風(fēng)向標(biāo)

GOPS 2019 · 深圳站

一手掌握 BATJ 國內(nèi)大企技術(shù)前沿的好機(jī)會

4月12-13,相聚深圳

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多