150 lines
2.5 KiB
Markdown
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` 属于多行输入重定向
|
|
- 管道 `|` 是把前一个命令输出交给后一个命令处理
|