wiki/运维/操作系统/Linux/笔记/17.IO重定向.md
2026-04-08 15:02:24 +08:00

150 lines
2.5 KiB
Markdown

## 1、I/O 重定向概览
Linux 程序默认会使用 3 个标准输入输出通道:
- **标准输入** `STDIN`:文件描述符 `0`
- **标准输出** `STDOUT`:文件描述符 `1`
- **标准错误** `STDERR`:文件描述符 `2`
理解这 3 个通道后,重定向和管道就会非常好理解。
## 2、标准输入输出说明
### 2.1 标准输入 `STDIN`
默认从终端读取输入。
### 2.2 标准输出 `STDOUT`
默认把正常结果输出到当前终端。
### 2.3 标准错误 `STDERR`
默认把错误信息也输出到终端。
虽然默认都显示在终端里,但 `STDOUT``STDERR` 在逻辑上是两条不同的输出流。
## 3、输出重定向
### 3.1 重定向标准输出
```shell
command > file
```
等价于:
```shell
command 1> file
```
表示把标准输出写入文件。
### 3.2 重定向标准错误
```shell
command 2> error.log
```
表示把错误输出写入文件。
### 3.3 同时重定向标准输出和标准错误
```shell
command &> all.log
```
表示把正常输出和错误输出都写入同一个文件。
### 3.4 追加重定向
```shell
command >> file
command 2>> error.log
```
表示追加到文件末尾,而不是覆盖原内容。
## 4、输入重定向
可以把文件内容作为命令输入:
```shell
command < file
```
例如:
```shell
wc -l < /etc/passwd
```
## 5、多行重定向 Here Document
Here Document 用于把多行文本直接传给命令输入。
```shell
cat > 1.txt <<EOF
1231231
asasssf
EOF
```
说明:
- `EOF` 只是结束标记,不一定必须写成 `EOF`
- 也可以换成其他自定义标识符
## 6、管道 `|`
管道会把前一个命令的标准输出,作为后一个命令的标准输入。
```shell
命令1 | 命令2 | 命令3
```
### 6.1 示例
```shell
cat /etc/passwd | grep root
```
```shell
ps -ef | grep nginx | wc -l
```
## 7、常见使用场景
### 7.1 保存命令输出
```shell
ip addr > ip.txt
```
### 7.2 单独保存报错信息
```shell
find /root -name "*.log" 2> error.log
```
### 7.3 把结果和错误一起保存
```shell
bash script.sh &> run.log
```
### 7.4 通过管道过滤结果
```shell
dmesg | grep -i error
```
## 8、小结
- `0``1``2` 分别表示标准输入、标准输出、标准错误
- `>``1>` 用于重定向标准输出
- `2>` 用于重定向错误输出
- `&>` 可同时重定向标准输出和错误输出
- `<<EOF` 属于多行输入重定向
- 管道 `|` 是把前一个命令输出交给后一个命令处理