# 标准输入输出和重定向
## 标准输入输出012
在Linux系统中`0 1 2` 是一个文件描述符。
| 名称 | 代码 | 操作符 | Java表示 | Linux下文件描述符(Debian) |
| -------------------- | ---- | ------------------ | ------------ | ----------------------------------------------- |
| 标准输入(stdin) | 0 | < 或 << | `System.in` | `/dev/stdin -> /proc/self/fd/0 -> /dev/pts/0` |
| 标准输出(stdout) | 1 | `>, >>, 1> 或 1>>` | `System.out` | `/dev/stdout -> /proc/self/fd/1 -> /dev/pts/0` |
| 标准错误输出(stderr) | 2 | `2> 或 2>>` | `System.err` | `/dev/stderr -> /proc/self/fd/2 -> /dev/pts/0` |
平时使用的重定向写入命令
```bash
echo "wang" > test.txt
```
其实也可以写成
```bash
echo "wang" 1> text.txt
```
## 输入输出
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
| 命令 | 说明 |
| --------------- | ------------------------------------------------ |
| command > file | 将输出重定向到 file |
| command < file | 将输入重定向到file |
| command >> file | 将输出以追加的方式重定向到file |
| n > file | 将文件描述符为 n 的文件重定向到 file |
| n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file |
| n >& m | 将输出文件 m 和 n 合并 |
| n <& m | 将输入文件 m 和 n 合并 |
放在**>**后面的**&**,表示重定向的目标不是一个**文件**,而是一个**文件描述符**。内置的文件描述符 **0** 为标准输入,文件描述符 **1** 为标准输出,文件描述符 **2** 为标准错误输出。 常见的 **2>&1** ,表示 stderr 错误输出重定向到 stdout 标准输出。
## /dev/null文件
如果希望执行某个命令,但是不想看到结果,那么就把输出重定向一个永远不存在的东西上,`/dev/null` 就是一个黑洞垃圾站,不要的东西都放进来。/dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
```bash
# 如果希望屏蔽 stdout 和 stderr
command > /dev/null 2>&1
#意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出。
```