Linux shell編程(三):管道和重定向

標準輸入輸出

執行一個shell命令行時一般會自動打開三個標準文件
即標準輸入文件(stdin),一般對應終端的鍵盤;標準輸出文件(stdout)和標準錯誤輸出文件(stderr),這兩個文件都對應終端的屏幕。進程將從標準輸入文件中獲得輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。shell

標準輸入輸出描述符

  • 標準輸入(stdin):0
  • 標準輸出(stdout):1
  • 標準錯誤(stderr):2

管道

「管道」是由一個控制操做符 "|" 或 「|&」 分隔的簡單命令序列。編程

管道格式

[time [-p]] [!] COMMAND1 [ [| or |&] COMMAND2 ...]

經過管道,一個命令的輸出能夠做爲另外一個命令的輸入。bash

管道中的每一個命令的輸出經過一個管道鏈接到下一個命令的輸入。也就是說,每一個命令讀取前一個命令的輸出。此鏈接在命令指定的任何重定向以前執行。tcp

若是使用「|&」,命令1的標準錯誤將經過管道鏈接到COMMAND2的標準輸入;它是「2>&1 |」的簡寫。標準錯誤的隱式重定向是在命令指定的任何重定向以後執行的。ide

# 例如:
[root@bogon ~]# cat /etc/passwd|gawk -F: '/^r/{print $p}'  # 命令cat的輸出經過管道符 | 做爲了命令gawk的輸入 
root:x:0:0:root:/root:/bin/bash
rjl:x:1000:1000:rjl:/home/rjl:/bin/bash
[root@bogon ~]#

輸入輸出重定向

輸入重定向

輸入重定向使用符號」<"來完成
命令 << 分界符 # 標準輸入中讀入,直到碰見分界符 才中止 通常分界符用EOFthis

命令 < 文件1 > 文件2 #將文件1作爲命令的標準輸入並將標準輸出重定向到文件2,,會清空原來的文件數據spa

here-documents

這種類型的重定向指示shell從當前源讀取輸入,直到看到只包含單詞(沒有尾隨空格)的行。全部讀到該點的行都被用做命令的標準輸入。命令行

# here-documents 格式:
     <<[-]WORD
             HERE-DOCUMENT
     DELIMITER
 # 例如:

Linux shell編程(三):管道和重定向

沒有參數擴展、命令替換、算術擴展或文件名擴展。若是引用了WORD中的任何字符,則分隔符是在WORD中引用刪除的結果,而here文檔中的行沒有展開。若是單詞沒有被引用,那麼全部的here文檔的行都受到參數擴展、命令替換和算術擴展的影響。在後一種狀況下,將忽略字符序列'\newline',而'\'必須用於引用字符'\'、'$'和' '。code

Here Strings

# here strings格式:
    <<< WORD

# 例如:

Linux shell編程(三):管道和重定向

WORD被擴展並提供給它的標準輸入的命令。blog

# 如:
[root@bogon ~]# cat -n < Html.py  # 查看Html.py文件的內容,通常可省略「<"符號
     1  #coding:utf-8
     2  from HtmlTool.tool.Html import Html
     3  
     4  a=Html("a")
     5  a.setAttribute(href="https://www.baidu.com",title="this is baidu")
     6  p=Html("p")
     7  p.setAttribute(alt="",cls="a b c d e f g")
     8  span=Html("span")
     9  span.setAttribute(cls="a b c d e f g",data="")
    10  p.children(span)
    11  a.children(p)
    12  a.children(span)
    13  print a.toString()
[root@bogon ~]#

輸出重定向

輸出重定向使用符號" > "來完成,使用標準重定向符號可將命令的標準輸出或標準錯誤寫入到某個文件。
當使用單個」>"時,目標文件內容將會被擦除,而後將前面命令的輸入寫入到目標文件。
當使用兩個">"時,即:>> 。目標文件以前的內容不會被擦除,而是將命令的輸出追加至目標文件。

# 例如:
# 命令 ls 標準輸出信息將會被重定向至文件dir.txt。若是dir.txt不存在,將會被建立。
# 若是dir.txt文件已存在,則其原來的內容將會被替換成ls命令的標準輸出。

輸出重定向

#  例如:
#  有一個文件名爲 dir.txt 的文本文件,它的內容是 1.
#  如今使用兩個輸出重定向符號「>>」 將ls命令的標準輸入追加至dir.txt
#  則 dir.txt 的文件內容變成了 
1
.

Linux shell編程(三):管道和重定向

錯誤重定向

在默認,使用重定向符號 > 只會將標準輸出重定向。而不會將標準錯誤也重定向。除非顯式的指明。

# 例如
# ls 1> dir.txt # 將ls的標準輸出重定向至文件dir.txt
# ls 1>> dir.txt # 將ls的標準輸出追加至文件dir.txt
# ls a 2 > dir.txt # 將ls的標準錯誤重定向至文件dir.txt,若是ls沒有找到目錄a將會報錯
# ls a 2 >> dir.txt # 將ls的標準錯誤追加至文件dir.txt

Linux shell編程(三):管道和重定向

Linux shell編程(三):管道和重定向

將標準錯誤重定向到標準輸出

>默認爲標準輸出重定向,與 1> 相同

2>&1 標準錯誤輸出 重定向到 標準輸出.
&>file 標準輸出 和 標準錯誤輸出 都重定向到文件file中

# 例如:
# 將標準輸出(文件描述符1)和標準錯誤(文件描述符2)定向到文件dir.txt。

Linux shell編程(三):管道和重定向

只將標準輸出指向文件dir.txt,由於標準錯誤在標準輸出被重定向到dir.txt 以前被複制了標準輸出。

Linux shell編程(三):管道和重定向

# Bash在重定向時特別處理多個文件名,以下表所述:
文件 描述
/dev/fd/FD 若是FD是一個有效的整數,那麼文件描述符FD將被複制。
/dev/stdin 文件描述符0被複制。
/dev/stdout 文件描述符1被複制。
/dev/stderr 文件描述符2被複制。
/dev/tcp/host/port 若是主機是一個有效的主機名或Internet地址,而端口是一個整數端口號或服務名稱,則Bash嘗試打開對應的套接字的TCP鏈接。

打開或建立文件的失敗會致使重定向失敗。使用大於9的文件描述符的重定向應該當心使用,由於它們可能與shell在內部使用的文件描述符衝突。

相關文章
相關標籤/搜索