<em id="pn7p8"><acronym id="pn7p8"><u id="pn7p8"></u></acronym></em>

    <th id="pn7p8"></th>

    <button id="pn7p8"></button>

      <dd id="pn7p8"></dd>
      <progress id="pn7p8"><track id="pn7p8"></track></progress>

      Linux培訓
      達內IT學院

      400-111-8989

      深入 Linux I/O 重定向

      • 發布:Linux培訓
      • 來源:Linux運維
      • 時間:2017-01-20 14:52

      Linux 中默認情況下始終有 3 個“文件”處于打開狀態,stdin(鍵盤)、 stdout(屏幕)和 stderr(錯誤消息輸出到屏幕上)。這 3 個文件和其他打開的文件都可以被重定向。重定向,簡單的說就是捕捉一個文件、命令、程序、腳本,或者是腳本中的代碼塊的輸出,然后將這些輸出作為輸入發送到另一個文件、命令、程序或腳本中。

      每個打開的文件都會被分配一個文件描述符。stdin、stdout 和 stderr 的文件描述符分別是 0、1 和 2。除了這 3 個文件,對于其它那些需要打開的文件,保留了文件描述符 3 到 9。在某些情況下,將這些額外的文件描述符分配給 stdin、stdout 或 stderr 作為臨時的副本鏈接是非常有用的。在經過復雜的重定向和刷新之后需要把它們恢復成正常狀態。

      重定向

      > file

      將 stdout 重定向到一個文件。如果這個文件不存在,那就創建,否則就覆蓋。

      創建一個包含目錄樹列表的文件:

      l

      ls -lR >dir-tree.list

      清空文件:

      : > file

      這是一個 > 操作,將會把文件 file 變為一個空文件(就是 size 為 0)。如果文件不存在,那么就創建一個 0 長度的文件(與touch 的效果相同)。: 是一個占位符,不產生任何輸出。

      也可以省略 : 占位符:

      > file

      與上邊的 : > 效果相同, 但是某些 shell (比如 bash)可能不支持這種形式。

      >> file

      將 stdout 重定向到一個文件。如果文件不存在,那么就創建它,如果存在,那么就追加到文件后邊。

      script.sh 1 > filename
      # 重定向 stdout 到文件"filename".
      script.sh 1 >> filename
      # 重定向并追加 stdout 到文件"filename".
      script.sh 2 > filename
      # 重定向 stderr 到文件"filename".
      script.sh 2 >> filename
      # 重定向并追加 stderr 到文件"filename".

      &> file

      將 stdout 和 stderr 都重定向到文件:

      script.sh &> /dev/null

      m> file>

      m 是一個文件描述符,如果沒有明確指定的話默認為 1。

      file 是一個文件名。文件描述符 m 被重定向到文件 file。

      script.sh 2> error.log

      m>&n

      m 是一個文件描述符,如果沒有明確指定的話默認為 1。

      n 是另一個文件描述符。

      script.sh 2>&1

      重定向 stderr 到 stdout。將錯誤消息的輸出,發送到與標準輸出所指向的地方。

      exec 6<>File
      script.sh >&6

      默認的,重定向文件描述符 1(stdout)到 6。所有傳遞到 stdout 的輸出都送到 6 中去。

      < file

      從文件中接受輸入。與 > 是成對命令,并且通常都是結合使用。0 < file 或 < file,前面的標準輸入 stdin 0 可以省略。

      grep search-word < filename

      j<>file

      為了讀寫 file,把文件 file 打開,并且將文件描述符 j 分配給它。

      如果文件 file 不存在,那么就創建它。如果文件描述符 j 沒指定,那默認是標準輸入 stdin 0 。

      echo 1234567890 > File ### 寫字符串到 File .
      exec 3<>File ### 打開 File 并且將 fd 3 分配給它.
      read -n 4 <&3 ### 只讀取4個字符.
      echo -n . >&3 ### 寫一個小數點.
      exec 3>&- ### 關閉fd 3.
      cat File ### ==> 1234.67890

      (注:上述命令的輸出結果和原文不同,原因未知。)

      管道

      管道與 > 很相似,但是實際上更通用。對于想將命令、腳本、文件和程序串連起來的時候很有用。

      cat *.txt | sort | uniq > result-file

      上述命令對所有 .txt 文件的輸出進行排序,并且刪除重復行。最后將結果保存到 result-file 中。

      可以將輸入輸出重定向和/或管道的多個實例結合到一起寫在同一行上:

      command < input-file > output-file

      等價于:

      < input-file command > output-file

      但是這種寫法不標準,有的 shell 可能不支持。

      可以將多個輸出流重定向到一個文件上:

      ls -yz >> command.log 2>&1

      將錯誤選項 yz 的結果放到文件 command.log 中。因為 stderr 被重定向到這個文件中,所以所有的錯誤消息也就都指向那里了。

      注意,下邊這個例子就不會給出相同的結果:

      ls -yz 2>&1 >> command.log

      輸出一個錯誤消息,但是并不寫到文件中。命令的輸出(如果有的話)寫入到文件 command.log。

      如果同時將 stdout 和 stderr 都重定向,命令的順序不同會帶來不同的結果。

      關閉文件描述符

      n<&- 關閉輸入文件描述符 n。

      0<&- 或 <&- 關閉 stdin。

      n>&- 關閉輸出文件描述符 n。

      1>&- 或 >&- 關閉 stdout。

      子進程繼承了打開的文件描述符。這就是為什么管道可以工作的原因。如果想阻止文件描述符被繼承,那么可以關掉它。

      只將 stderr 重定到一個管道。

      exec 3>&1 ### 保存當前 stdout 的"值"(將 fd3 指向 fd0 相同目標)
      ls -l 2>&1 >&3 3>&- | grep bad 3>&- ### 對'grep'關閉 fd 3
      ###            ^^^^   ^^^^          ###(但不關閉'ls',正常輸出內容不受grep影響)
      ls -l 2>&1 >&3 | grep bad ### 這樣輸出內容被轉到了 fd3,也不會受 grep 影響
      ls badabc -l 2>&1 >&3 |grep bad ### stderr 通過 fd1 輸出,會受 grep 影響
      exec 3>&- ### 對于剩余的腳本來說,關閉它

      使用文件描述符 5 可能會引起問題。當 Bash 使用 exec 創建一個子進程的時候,子進程會繼承文件描述符 5 (參考 Chet Ramey 的歸檔 e-mail: RE: File descriptor 5 is held open)。 最好還是不要去招惹這個特定的文件描述符 5 。

      預約申請免費試聽課

      填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

      上一篇:4個Linux下超好的命令行下載管理器/加速器
      下一篇:如何在 Shell 腳本中跟蹤調試命令的執行

      在Linux中設置sudo的十條sudoers實用配置

      Linux下安裝Node.js詳細完整教程

      深入 Linux I/O 重定向

      安裝Linux時的注意事項

      • 掃碼領取資料

        回復關鍵字:視頻資料

        免費領取 達內課程視頻學習資料

      • 視頻學習QQ群

        添加QQ群:1143617948

        免費領取達內課程視頻學習資料

      Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

      選擇城市和中心
      黑龍江省

      吉林省

      河北省

      湖南省

      貴州省

      云南省

      廣西省

      海南省

      高清特黄a大片,日本真人真做爰,特级做人爱C级,免费a级毛片 百度 好搜 搜狗
      <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>