<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      標簽列表

      everest33

      自制力

      導航

      shell中 >/dev/null 2>&1 是什么意思

      我們經常能在 shell 腳本中發現 >/dev/null 2>&1 這樣的語句。以前的我并沒有去深入地理解這段命令的作用,照搬照用,直到上周我將這段命令不小心寫成了 2>&1 >/dev/null ,出了一點小問題之后,我才開始去了解這段命令背后的“玄機”。

      shell重定向介紹

      就像我們平時寫的程序一樣,一段程序會處理外部的輸入,然后將運算結果輸出到指定的位置。在交互式的程序中,輸入來自用戶的鍵盤和鼠標,結果輸出到用戶的屏幕,甚至播放設備中。而對于某些后臺運行的程序,輸入可能來自于外部的一些文件,運算的結果通常又寫到其他的文件中。而且程序在運行的過程中,會有一些關鍵性的信息,比如異常堆棧,外部接口調用情況等,這些都會統統寫到日志文件里。

      shell腳本也一樣,但是我們一般在使用shell命令的時候,更多地還是通過鍵盤輸入,然后在屏幕上查看命令的執行結果。如果某些情況下,我們需要將shell命令的執行結果存儲到文件中,那么我們就需要使用輸入輸出的重定向功能。

      文件描述符

      當執行shell命令時,會默認打開3個文件,每個文件有對應的文件描述符來方便我們使用:

      類型 文件描述符 默認情況 對應文件句柄位置
      標準輸入(standard input) 0 從鍵盤獲得輸入 /proc/slef/fd/0
      標準輸出(standard output) 1 輸出到屏幕(即控制臺) /proc/slef/fd/1
      錯誤輸出(error output) 2 輸出到屏幕(即控制臺) /proc/slef/fd/2

      所以我們平時在執行shell命令中,都默認是從鍵盤獲得輸入,并且將結果輸出到控制臺上。但是我們可以通過更改文件描述符默認的指向,從而實現輸入輸出的重定向。比如我們將1指向文件,那么標準的輸出就會輸出到文件中。

      輸出重定向

      輸出重定向的使用方式很簡單,基本的一些命令如下:

      命令 介紹
      command >filename 把標準輸出重定向到新文件中
      command 1>filename 同上
      command >>filename 把標準輸出追加到文件中
      command 1>>filename 同上
      command 2>filename 把標準錯誤重定向到新文件中
      command 2>>filename 把標準錯誤追加到新文件中

      我們使用 > 或者 >> 對輸出進行重定向。符號的左邊表示文件描述符, 如果沒有的話表示1,也就是標準輸出 ,符號的右邊可以是一個文件,也可以是一個輸出設備。當使用 > 時,會判斷右邊的文件存不存在,如果存在的話就先 刪除 ,然后創建一個新的文件,不存在的話則直接創建。但是當使用 >> 進行追加時,則不會刪除原來已經存在的文件。

      為了更好地理解輸出重定向,感受重定向的“魅力”,我們看一下以下的例子:我們創建一個 測試 目錄 ,目錄下面僅有一個a.txt文件。

      # tree.
      └── a.txt directories,1 file # ls a.txt b.txt ls:無法訪問b.txt:沒有那個文件或目錄 a.txt

      在我們執行 ls a.txt b.txt 之后,一共有兩種輸出,其中 ls:無法訪問b.txt:沒有那個文件或目錄 是錯誤輸出, a.txt 是標準輸出。

      # ls a.txt b.txt 1>out
      ls:無法訪問b.txt:沒有那個文件或目錄

      # cat out a.txt # ls a.txt b.txt >>out ls:無法訪問b.txt:沒有那個文件或目錄

      # cat out a.txt a.txt

      在上述命令中,我們將原來的標準輸出重定向到了out文件中,所以控制臺只剩下了錯誤提示。并且當執行了追加操作時,out文件的內容非但沒有被清空,反而又多了一條 a.txt。

      同理,我們也可以將錯誤輸出重定向到文件中:

      # ls a.txt b.txt 2>err
      a.txt
      # cat err
      ls:無法訪問b.txt:沒有那個文件或目錄# ls a.txt b.txt >out 2>err

      # cat out a.txt # cat err ls:無法訪問b.txt:沒有那個文件或目錄

      看到這里, 朋友們 可能會發現 >out 2>err 和我們在一開頭提到的 >/dev/null 2>&1 已經很像了,別急,這待會再說。

      輸入重定向

      在理解了輸出重定向之后,理解輸入重定向就會容易得多。對輸入重定向的基本命令如下:

      命令介紹
      command <filename 以filename文件作為標準輸入
      command 0<filename 同上
      command <<delimiter 從標準輸入中讀入,直到遇到delimiter分隔符

      我們使用 < 對輸入做重定向, 如果符號左邊沒有寫值,那么默認就是0 。

      我們這次以cat命令為例,如果cat后面沒有跟文件名的話,那它的作用就是將標準輸入(比如鍵盤)回顯到標準輸出(比如屏幕)上:

      # cat
      test
      test

      我們可以將利用輸入重定向,將我們在鍵盤上敲入的字符寫入到文件中。我們需要使用ctrl+c來結束輸入:

      # cat >out
      test
      ^C
      # cat out
      test

      好了,此時我們覺得自己在鍵盤上敲比較累,還是直接讓cat讀取一個文件吧。那么我們需要利用輸入重定向:

      # cat input
      aaa
      # cat >out <input
      # cat out aaa

      神奇的事情發生了,out文件里面的內容被替換成了input文件里的內容。那么 << 又是什么作用呢?我們再看:

      # cat >out <<end
      >123
      >test
      >end
      # cat out
      123
      test

      我們看到,當我們輸入完 cat >out<<end ,然后敲下回車之后,命令并沒有結束,此時cat命令像一開始一樣,等待你給它輸入數據 。然后當我們敲入 end 之后,cat命令就結束了。 end 之前輸入的字符都已經被寫入到了out文件中。這就是輸入分割符的作用。

      高級用法

      重定向綁定

      好了,在有了以上知識的基礎上,我們再來看開頭提到的 >/dev/null 2>&1 。這條命令其實分為兩命令,一個是 >/dev/null ,另一個是 2>&1 。

      ·>/dev/null·

      這條命令的作用是將標準輸出1重定向到/dev/null中。/dev/null代表 linux 的空設備文件,所有往這個文件里面寫入的內容都會丟失,俗稱“黑洞”。那么執行了 >/dev/null 之后,標準輸出就會不再存在,沒有任何地方能夠找到輸出的內容。

      ·2>&1·

      這條命令用到了重定向綁定,采用&可以將兩個輸出綁定在一起(即&1代表標準輸出的位置)。這條命令的作用是錯誤輸出將和標準輸出同用一個文件描述符,說人話就是錯誤輸出將會和標準輸出輸出到同一個地方。

      linux在執行shell命令之前,就會確定好所有的輸入輸出位置,并且從左到右依次執行重定向的命令,所以 >/dev/null 2>&1 的作用就是讓標準輸出重定向到/dev/null中(丟棄標準輸出),然后錯誤輸出由于重用了標準輸出的描述符,所以錯誤輸出也被定向到了/dev/null中,錯誤輸出同樣也被丟棄了。執行了這條命令之后, 該條shell命令將不會輸出任何信息到控制臺,也不會有任何信息輸出到文件中 。

      >/dev/null    2>&1 VS 2>&1     >/dev/null

      【插入一段自己的筆記】在Linux上試驗,兩個順序不一致的確會像下文講的一樣。但是在使用java命令   java MyProgramm 2>&1 >/path/to/1.txt 時,并沒有不一樣,這種寫法也是標準錯誤和標準輸出都重定向到了1.txt文件中。應該是java命令做了某些改動。

      再回到 文章 的開頭,我說我弄反了 >/dev/null2>&1 拼裝的順序,導致出了一點小問題。乍眼看這兩條命令貌似是等同的,但其實大為不同。剛才提到了,linux在執行shell命令之前,就會確定好所有的輸入輸出位置,并且從左到右依次執行重定向的命令。那么我們同樣從左到右地來分析 2>&>/dev/null

      1. 2>&1,將錯誤輸出綁定到標準輸出上。由于此時的標準輸出是默認值,也就是輸出到屏幕,所以錯誤輸出會輸出到屏幕。
      2. >/dev/null,將標準輸出1重定向到/dev/null中。

      我們用一個表格來更好地說明這兩條命令的區別:

      命令 標準輸出 錯誤輸出
      >/dev/null    2>&1 丟棄 丟棄
      2>&1    >/dev/null 丟棄 屏幕

      >/dev/null   2>&1 VS >/dev/null    2>/dev/null

      那么可能會有些同學會疑問,為什么要用重定向綁定,而不是像 >/dev/null   2>/dev/null 這樣子重復一遍呢。

      為了回答這個問題,我們回到剛才介紹輸出重定向的場景。我們嘗試將標準輸出和錯誤輸出都定向到out文件中:

      # ls a.txt b.txt >out 2>out
      # cat out
      a.txt
      ?法訪問b.txt: 沒有那個文件或目錄

      WTF?竟然出現了亂碼,這是為啥呢?這是因為采用這種寫法,標準輸出和錯誤輸出會搶占往out文件的管道,所以可能會導致輸出內容的時候出現缺失、覆蓋等情況?,F在是出現了亂碼,有時候也有可能出現只有error信息或者只有正常信息的情況。不管怎么說,采用這種寫法,最后的情況是無法預估的。

      而且,由于out文件被打開了兩次,兩個文件描述符會搶占性的往文件中輸出內容,所以整體 IO 效率不如  >/dev/null  2>&1 來得高。

      nohup結合

      我們經常使用 nohup command &
      命令形式來啟動一些后臺程序,比如一些 java 服務:

      # nohup java -jar xxxx.jar &

      為了不讓一些執行信息輸出到前臺(控制臺),我們還會加上剛才提到的 >/dev/null 2>&1 命令來丟棄所有的輸出:

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

      總結

      本文主要介紹了linux重定向的原理以及一些基本命令,并且詳細地分析了 >/dev/null 2>&1 這個命令以及一些注意點。

      總而言之,在工作中用到最多的就是 nohup command >/dev/null 2>&&命令, 希望 大家能夠好好掌握。  

      小問題

      接著本文的場景,下面命令,錯誤輸出會輸出到什么地方呢?

      # ls a.txt b.txt 2>&1 >/dev/null 2>&1
      答案: 注意上面一句話,Linux在執行shell命令之前就已經確定了輸入輸出的位置,并且從左往右依次執行重定向的命令。
      在執行之前,這個命令從左往右: 標準錯誤 綁定至標準輸出上(即屏幕), 然后標準輸出重定向到/dev/null,然后標準錯誤又重新綁定到標準輸出(現在是/dev/null了),
      所以最終,標準錯誤和標準輸出都重定向到了空設備/dev/null上了。

      posted on 2019-09-19 23:51  everest33  閱讀(8294)  評論(2)    收藏  舉報

      主站蜘蛛池模板: 人妻精品久久无码区| 最近中文字幕免费手机版 | 精品一区二区不卡免费| 人人澡人摸人人添| 国产精品午夜福利清纯露脸| 国产精品一二三中文字幕| 色综合AV综合无码综合网站| 中日韩中文字幕一区二区| 成年女人免费视频播放体验区| 激情五月天一区二区三区| 天天做天天爱夜夜爽导航| 麻豆国产va免费精品高清在线| 国产毛片精品一区二区色| 亚洲情A成黄在线观看动漫尤物 | 国精产品999国精产品官网| 国产成人午夜一区二区三区 | 午夜成人精品福利网站在线观看| 亚洲国产日韩精品一区二区三区| 欧洲精品码一区二区三区| 高阳县| 黄色大全免费看国产精品| 极品尤物被啪到呻吟喷水| 亚洲国产成人资源在线| 亚洲嫩模一区二区三区| 综合亚洲网| 日韩av不卡一区二区在线| 九九久久自然熟的香蕉图片| 色爱av综合网国产精品| 亚洲中文字幕在线二页| 精品无码国产日韩制服丝袜| 黑人玩弄人妻中文在线| av在线网站手机播放| 国产视频一区二区三区麻豆| 国产手机在线αⅴ片无码观看| 国产精品伦理一区二区三| 青青国产揄拍视频| 中文字幕av日韩有码| 亚洲国产成人精品区综合| 蜜桃视频在线免费观看一区二区 | 亚洲avav天堂av在线网爱情| 一区二区三区午夜无码视频|