重定向與管道

一、解讀重定向

  程序必須能夠讀入輸入然後經過加工來顯示結果,程序獲取的數據也多種多樣,程序生產出來的結果也是多種多樣的。也就是說程序要有讀入也要有輸出。

wKioL1egQ6OwiLJpAAA4Vphh9aA605.png

    讀入數據:Input

    輸出數據:Output

  在linux中一切接文件。這就意味着,任何設備在系統中都有一個與之對應的文件。所以我們就可以通過文件來訪問設備。對於用戶來說,訪問文件就是通過文件名來進行的,用戶看到的是文件名,但是,對於內核來說,所有都是數字,這個數字就是文件描述符來訪問文件。打開現存文件或新的文件時,內核返回一個fd。讀寫文件都需要使用fd來制定讀寫的文件。fd:file descriptor(文件描述符)

    linux給程序提供三種I/O設備

        標準輸入(STDIN) -0 默認接受來自鍵盤的輸入

        標準輸出(STDOUT)-1 默認輸出到終端窗口

        標準錯誤(STDERR)-2 默認輸出到終端窗口

    I/O重定向:改變默認位置

wKiom1egQ6STCyxFAAAk_za36v8412.png

  當執行重定向時我們看到 ls顯示的結果被輸出到一個新的文件中,如果testdir中沒有該文件,那麼將自動創建該文件。

wKioL1egQ6TzlKcoAAAr8DzLGzk872.png

  而我又將ll結果重定向到文件中,那麼我們會發現,之前的結果沒有了,都被覆蓋了,所以文件的創建方法是。

1:該文件若不存在,系統會自動建立該文件。

2:當這個文件存在,系統會將這個文件的內容清空,讓後將數據寫入。

3:如果以>輸出到一個已存在的文件,文件會被覆蓋。

  如果我們不想覆蓋該文件使用>>(累加)就可以了

二、重定向具體用法

  STDOUT和TDERR可以被重定向到文件:

    命令  操作符號  文件名

   支持的操作符號有:

    > 把STDOUT重定向到文件

    2> 把STDERR重定向到文件

    &> 把所有輸出重定向到文件

   >文件內容會被覆蓋

    #set -C:禁止將內容覆蓋已有文件,但可追加強制覆蓋:>|

    #set+C:允許覆蓋

   >>  原有內容基礎上,追加內容

  把輸出和錯誤重新定向到文件

    2>:覆蓋重定向錯誤輸出數據流;

    2>>:追加重定向錯誤輸出數據流;

    標準輸出和錯誤輸出各自定向至不同位置:

    COMMAND > /path/to/file.out > /path/to/error.out

    合併標準輸出和錯誤輸出爲同一個數據流進行重定向

        &>:覆蓋重定向

        &>>:追加重定向

       COMMAND > /path/to/file.out 2>&1(順序重要)

       COMMAND >> /path/to/file.out 2>>&1(順序重要)

    find /etc -name passwd  2> /dev/null

  /dev/null垃圾桶黑洞的用法

    如果我們知道會出現大量的錯誤信息而又不想讓它顯示出來,這個時候使用黑洞設備/dev/null。它可以吃掉導向它的所有信息

    ():合併多個程序的STDOUT

      (cal 2007;cal2008)>all.txt

    standard input:<與<<

   <就是講原本需要由鍵盤輸入的數據改由文件內容來替代。如下圖所示。

wKioL1egQ6TQv5oCAABDUbtjDB0855.png

   <很有幫助,尤其是在發郵件mail這種命令中。那麼<<又是什麼意思呢,它代表結束輸入的意思。如下圖

wKiom1egQ6WTQygMAAAc9ZyI3l8797.png

可以看出end就是結束輸入,他並沒有顯示在文件中。

    使用<來重定向標準輸入

    某些命令能夠接受從文件中導入的STDIN:

        $tr 'a-z'  'A-Z'< /etc/issue

    將文件中的小寫字母轉換爲大寫字母。

        tr -d abc</etc/issue

    刪除issue文件中所有abc中任意字母。

        #cat > filea  

    按ctrl+d離開,可以使用文件來代替鍵盤的輸入

        #Cat > filea < fileb




   tr-轉換和刪除字符

    tr[OPTION]...SET1[SET2]

    選項:

        -c或--complerment:取字符集的補集

        -d或--delete:刪除所有屬於第一字符集的字符

        -s或-squeeze-repeats:把連續重複的字符以單獨一個字符表示

        -t或--truncate-set1:將第一個字符集對應字符轉化爲第二字符集對應的字符

   管道

wKiom1egQ6WwMkqsAAARuJaaItQ367.png

    管道(使用符號“|”表示)用來連接命令

        命令1 | 命令2 | 命令3 | …

    將命令1的STDOUT發送給命令2的STDIN,命令2的 STDOUT發送到命令3的STDIN

    STDERR默認不能通過管道轉發,可利用2>&1 或 |& 實現

    最後一個命令會在當前shell進程的子shell進程中執行用來

    組合多種工具的功能

        ls | tr 'a-z' 'A-Z'

    less :一頁一頁地查看輸入:

        $ ls -l /etc | less

    mail: 通過電子郵件發送輸入:

        $ echo "test email" | mail \ -s "test" [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章