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

標準輸入輸出

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

標準輸入輸出描述符

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

管道

“管道”是由一個控制操作符 "|" 或 “|&” 分隔的簡單命令序列。

管道格式

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

通過管道,一個命令的輸出可以作爲另一個命令的輸入。

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

如果使用“|&”,命令1的標準錯誤將通過管道連接到COMMAND2的標準輸入;它是“2>&1 |”的簡寫。標準錯誤的隱式重定向是在命令指定的任何重定向之後執行的。

# 例如:
[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 ~]# 

輸入輸出重定向

輸入重定向

輸入重定向使用符號”<"來完成
命令 << 分界符 # 標準輸入中讀入,直到遇見分界符 才停止 一般分界符用EOF

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

here-documents

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

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

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

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

Here Strings

# here strings格式:
    <<< WORD

# 例如:

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

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

# 如:
[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在內部使用的文件描述符衝突。

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