# 重定向的含义及管道、tee命令的使用

程序是由数据和指令组成的，程序可理解为对数据的加工，就好比计算器，它本身是个程序，在计算器里面输入1 + 1，程序处理并输出结果2，这个结果也是个数据。

那么程序在数据加工时，首先需要加载数据或获取数据，程序本身都有默认的获取数据的方式，通常默认设备是键盘。例如，grap /etc/passwd，grep是命令程序，而/etc/passwd则是文件，也就是数据，那么grep程序要对/etc/passwd文件的数据进行加工处理时，grep需要获取/etc/passwd的文件数据，而这些文件的数据是程序的数据输入，可以把这一种数据输入的方式，称为“输入重定向”。

程序对数据进行加工处理后，需要把结果输出，通常程序输出设备为显示器，如果需要把结果永久存储起来，则需要把结果指向文件存储。这个对程序输出做重新指定的操作，称为“输出重定向”。

### 输入重定向

输入重定向主要更改程序的数据输入方式

将命令中接收输入的途径由默认的键盘改为其他文件，而不是等待从键盘输入。

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYp2HUUwSQO85DBaE1%2Fimage.png?alt=media\&token=486e1aae-23a0-4dab-84a7-83db9c6148ac)

### 输出重定向

定义：输出重定向是指将命令的正常输出结果保存到指定的文件中，而不是直接显示在显示器的屏幕上。

输出重定向使用 “＞”  “＞＞”操作符号。

语法：

＞文件名，表示将标准输出的内容，写到后面的文件中，如果此文件名已经存在，将会覆盖原文件中的内容，若此文件不存在，则会以此文件名写新建文件。

＞＞文件名，表示将标准输出的内容，以追加形式写到后面的文件中。若此文件不存在，则会以此文件名新建该文件。

```
cat /proc/cpuinfo > cpu.txt    #cpu.txt中如果有内容则会先清除再写入
cat /etc/passwd >> passwd.txt  #将读取的信息追加到passwd.txt文件中。
> text.txt                     #清空一个文件

```

### EOF的使用

EOF本意是End Of File，表明到了文件末尾。“EOF”通常与“＜＜”结合使用，“＜＜EOF”表示后续的输入作为子命令或者子Shell的输入，直到命令又遇到“EOF”，再次返回到主调Shell，可将其理解为分界符（delimiter）。既然是分界符，那么形式自然不是固定的，这里可以将“EOF”进行自定义，但是前后的分界符必须成对出现且不能和Shell命令冲突。

以＜＜EOF开始，以EOF结尾

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYqXbTkxRTcWrvB9gx%2F1626246615\(1\).png?alt=media\&token=8ca6a125-89b5-4cbb-8a63-bddca4d86728)

以ccc作为分界符

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYqm8V4f6RXjKlXMAd%2F1626246680\(1\).png?alt=media\&token=06aff40c-df91-4032-9d9e-2b6de3f7436a)

在脚本中可以通过输入重定向来打印消息菜单。

在使用的时候需要在“＜＜”右边跟一对终止符。终止符是可以自定义的

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYqv8XcHNyYG5NNoF2%2F1626246719\(1\).png?alt=media\&token=9412ee48-9c8f-4d14-9803-dad5cb5b1f34)

### 错误重定向

将命令执行过程中出现的错误信息（选项或参数错误）保存到指定的文件中，而不是直接显示到显示器。

```
重定向操作符：
输入重定向：1>或简写为>
输出重定向：0>或简写为>
错误重定向：2>
其中的2指的是标准错误输出的文件描述符（在使用标准输入和输出时省略了1、0编号）。
```

在实际应用中，错误重定向可以用来收集执行的错误信息，为排错提供依据。对于Shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中，以保持脚本输出的简洁。

将错误显示的内容和正确显示的内容分开

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYrjBAeNV5EEvZYowG%2F1626246933\(1\).png?alt=media\&token=d2ad6937-fbc2-4a6e-b8d0-161b3acb5d22)

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYs59w_OU5MJ_fvA9t%2Fimage.png?alt=media\&token=5722c136-4ca4-4f55-a9fe-bf653236e487)

注意：使用“2＞”操作符时，像使用“＞”操作符时一样，会覆盖目标文件的内容，若要追加而不覆盖文件的内容可使用“2＞＞”操作符。

### null黑洞和zero空文件

1．可以把/dev/null文件看作“黑洞”（是个特殊设备），所有写入的内容都会永远丢失，而尝试读取内容则什么也读不到，然而/dev/null文件对命令行和脚本都非常有用。

```
[root@testhost ~]# echo aaaaaa > /dev/null   #尝试输出一些内容到/dev/null
[root@testhost ~]# cat /dev/null     #什么信息也看不到
```

2./dev/zero，在类UNIX操作系统中是一个特殊的设备文件，读取该文件的时候，它会提供无限的空字符（NULL，ASCII NUL，0x00）。典型用法是用它来产生一个特定大小的空白文件。

使用dd命令产生一个50MB的文件

dd命令：用于转换并复制一个文件。参数如下。

（1）if代表输入文件。如果不指定if，默认就会从stdin中读取输入。

（2）of代表输出文件。如果不指定of，默认就会将stdout作为默认输出。

（3）bs代表以字节为单位的块大小。

（4）count代表被复制的块数。

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYt0wxrkrVNgisLSW4%2Fimage.png?alt=media\&token=b4ec849f-3c2a-4a59-959a-4fb493ee25ff)

对于程序输出的结果，正确的结果内容写入一个文件，错误的结果内容写入另一个文件。

```
[root@testhost ~]# ls /tmp xxxx >ok.txt 2>err.txt
```

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYtOM01LJOPkF-J6ES%2F1626247365\(1\).png?alt=media\&token=4dbb1d8b-bcd0-4f77-9b69-d32dd46567d3)

### &＞和＞&符号

```
&表示等同于的意思。
```

把正确的程序执行结果重定向到标准错误的结果内，输入一个相同的位置或文件。

1＞﹠2把标准输出重定向到标准错误，如图

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYu3UN-ACLoX8Ys2Ln%2F1626247543\(1\).png?alt=media\&token=fd07c8bc-480d-48a0-8894-f92a329a2914)

把错误的程序执行结果重定向到标准输出的程序结果内，输入一个相同的位置或文件。

2＞﹠1把标准错误重定向到标准输出，如图

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYuA1jc4iPOaMgnPbB%2F1626247570\(1\).png?alt=media\&token=0a2f29be-453a-40ab-8e3f-00bf1ed3c7eb)

```
[root@testhost ~]# ls /tmp xxxx >1.txt 2>&1

[root@testhost ~]# ls /tmp xxxx 2>2.txt 1>&2
```

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYvbLmp6FHSj3PTcWn%2Fimage.png?alt=media\&token=7ff38d91-9aa7-48d1-9a07-e300c6f63e91)

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYvefBq7sshxPgdoJb%2Fimage.png?alt=media\&token=7d45bde3-74ba-4b7d-a579-a9e764ff05d2)

在生产环境中的Shell脚本中的＞/dev/null 2＞& 1是什么意思？

```
[root@testhost ~]# cat /etc/passwd >/dev/null 2>&1
注意：将标准输出和错误输出全部重定向到/dev/null中，也就是将产生的所有信息丢弃。
```

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYwar3-PugYVRJdp6x%2Fimage.png?alt=media\&token=c26d26ae-d056-4c21-8b85-ba08d57b0e8f)

### 管道 | 的使用

```
语法：command -a | command -b | command-c |......
```

使用管道传输数据，如图

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYwsF-2CYUs2TWT9vR%2Fimage.png?alt=media\&token=a5ed3cfd-2ebd-4f04-8919-2ce393f0e790)

管道命令只处理前一个命令的正确输出，不处理错误输出。

管道右边的命令，必须是能够接收标准输入的数据流的命令。

管道符可以把两条命令连起来，并可以连接多个命令。

管道能够使进程之间完成数据传输，在A进程处理完数据后，把输出的结果通过管道传输给B进程。A进程输出的结果为“标准输出”，在B进程接收时，则为“标准输入”。因此，管道后面的需要支持接收“标准输入”的数据流。

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYx7mVcu9O4bcm9_q6%2Fimage.png?alt=media\&token=494641ca-020b-4cac-8af9-f7e26190d05c)

### tee 命令

功能：读取标准输入的数据，并将其内容输出成文件。

```
命令使用格式：tee [-a][--help][--version][文件...]。
参数如下：
（1）-a，--append：内容追加到给定的文件而非覆盖。
（2）--help：在线帮助。
```

tee命令会从标准输入设备读取数据，将其内容输出到标准输出设备，同时保存成文件，如图

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYxLYLPvRJSjLxhX4w%2F1626248404\(1\).png?alt=media\&token=5e0c287c-93fe-4e8c-910f-b730293d72ca)

![](https://2235202877-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdZjBNUdEHDSCeFdVYp%2F-MeYOrJ6aMGqsgVzVAPt%2F-MeYxinTLv4L0xcGhS4g%2F1626248502\(1\).png?alt=media\&token=3d9806e9-25f2-46ba-98d9-5e83c0735d3f)
