1、shell重定向概念:shell重定向包含輸出重定向和輸入重定向
何為輸入輸出方向?何為標準輸入輸出方向?
標準輸入方向:從鍵盤讀取用户輸入的數據,然後再把數據拿到程序(C語言程序、Shell 腳本程序等)中使用;這就是標準的輸入方向,也就是從鍵盤到程序。
標準輸出方向:相反,程序運行產生的數據一般都是直接呈現到顯示器上,這就是標準的輸出方向,也就是從程序到顯示器。
其實,輸入輸出方向就是數據流動的方向,那麼
輸入重定向就是改變程序數據的來源的
輸出重定向就是改變程序輸出屏幕到其他地方
2、硬件設備和文件描述符
計算機硬件有很多,常見的輸入設備有鍵盤、鼠標、麥克風、手寫板等,輸出設備有顯示器、投影儀、打印機等。不過,在 Linux 中,標準輸入設備指的是鍵盤,標準輸出設備指的是顯示器
同時,Linux 中一切皆文件,包括標準輸入設備(鍵盤)和標準輸出設備(顯示器)在內的所有計算機硬件都是文件,為了表示和區分已經打開的文件,Linux 會給每個文件分配一個 ID,這個 ID 就是一個整數,被稱為文件描述符(File Descriptor)。
與輸入輸出有關的文件描述符
|
文件描述符
|
文件名
|
類型
|
硬件
|
|
0
|
stdin
|
標準輸入
|
鍵盤
|
|
1
|
stdout
|
標準輸出
|
顯示器
|
|
2
|
stderr
|
標準錯誤輸出
|
顯示器
|
Linux 程序在執行任何形式的 I/O 操作時,都是在讀取或者寫入一個文件描述符。一個文件描述符只是一個和打開的文件相關聯的整數,它的背後可能是一個硬盤上的普通文件、FIFO、管道、終端、鍵盤、顯示器,甚至是一個網絡連接
3、Shell輸出重定向
表2:Bash 支持的輸出重定向符號
|
類 型
|
符 號
|
作 用
|
|
標準輸出重定向
|
命令 > 文件
|
以覆蓋的方式,把命令的正確輸出結果輸出到指定的文件或設備中。
|
|
命令 >> 文件
|
以追加的方式,把命令的正確輸出結果輸出到指定的文件或設備中。
|
|
|
標準錯誤輸出重定向
|
命令 2> 文件
|
以覆蓋的方式,把命令的錯誤信息輸出到指定的文件或設備中。
|
|
命令 2>> 文件
|
以追加的方式,把命令的錯誤信息輸出到指定的文件或設備中。
|
|
|
正確輸出和錯誤信息同時保存
|
命令 > 文件 2> &1
|
以覆蓋的方式,把正確輸出和錯誤信息同時保存到同一個文件中。
|
|
命令 >> 文件 2> &1
|
以追加的方式,把正確輸出和錯誤信息同時保存到同一個文件中。
|
|
|
命令 &> 文件
|
以覆蓋的方式,把正確輸出和錯誤信息同時保存到同一個文件中。
|
|
|
命令 &>> 文件
|
以追加的方式,把正確輸出和錯誤信息同時保存到同一個文件中。
|
|
|
命令 >> 文件1 2>> 文件2
|
把正確的輸出追加到文件1中,把錯誤信息追加到文件2中。
|
在輸出重定向中,>代表的是覆蓋,>>代表的是追加。
注意,在類似命令 2> 文件這樣的寫法中,2是文件描述符,它對應的是 stderr。
對於重定向中的標準輸出文件,可以省略文件描述符 1 不寫,而標準錯誤輸出文件,必須要寫上文件描述如 2。如果你願意,也可以將命令 > 文件寫作命令 1> 文件,但這樣做是多此一舉。
另外還要注意,2和>之間不能有空格,也就是説,不能將命令 2> 文件寫作命令 2 > 文件。
使用案例可查看
4、Shell輸入重定向
輸入重定向就是改變輸入的方向,不再使用鍵盤作為命令輸入的來源,而是使用文件作為命令的輸入
Bash 支持的輸出重定向符號
|
符號
|
説明
|
|
命令 < 文件
|
將指定的文件作為命令的輸入。
|
|
命令 << 分界符
|
從標準輸入(鍵盤)中讀取數據,直到遇見分界符才停止。
|
|
命令 < 文件1 > 文件2
|
將文件1作為命令的輸入,並將命令的處理結果輸出到文件2。
|
統計 readme.txt 文件中有多少行文本:
[c.biancheng.net]$ cat readme.txt #預覽一下文件內容
C語言中文網
http://c.biancheng.net/
成立7年了
日IP數萬
[c.biancheng.net]$ wc -l < readme.txt #輸入重定向
4
實例1
#!/bin/bash
while read str; do
echo $str
done < readme.txt
運行結果:
C語言中文網
http://c.biancheng.net/
成立7年了
日IP數萬
實例2
我們使用輸入重定向符號<<,這個符號的作用是使用特定的分界符作為命令輸入的結束標誌,而不使用 Ctrl+D 鍵。
[c.biancheng.net]$ wc -l << END
> 123
> 789
> abc
> xyz
> END
4
wc 命令會一直等待用輸入,直到遇見分界符 END 才結束讀取