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 才結束讀取