# Shell文件描述符与重定向 ## 基本概念 文件描述符是与文件输入相关联的整数 0 - - - stdin 标准输入 1 - - - stdout 标准输出 2 - - - stdout 标准错误 command > filename 把command的标准输出重定向到文件中 (先清空文件,再写入) command >> filename 把command的标准输出重定向到文件中 (以追加的方式写) 当使用重定向操作符时,被重定向的内容不会出现在屏幕上 重定向操作符默认使用标准输出, 如果需要使用特定的文件描述符, 则需要将该描述符置于操作符前面。 `>` 等同于 `1>` , `>>` 等同于 `1>>` ## 重定向 命令一般会把错误信息输出到标准错误中,例如给ls命令传入一个错误的参数`+`,将提示错误信息 下面的命令将标准错误输出到屏幕中,而没有输出到文件中,是因为标准`>`默认使用标准输出,而错误信息是通过标准错误输出的. ``` $ ls + > out.txt ls: cannot access +: No such file or directory ``` 使用`2>` 将标准错误重定向到文件中,没有输出到屏幕上 ``` $ ls + 2> out.txt $ cat out.txt ls: cannot access +: No such file or directory ``` 将stderr重定向到一个文件,将stdout重定向到另一个文件 `$cmd 2> stderr.txt 1> stdout.txt` 将stderr转换为stdout,使得stderr和stdout都被重定向到一个文件 ``` cmd 2>&1 output.txt cmd output.txt 2>&1 ``` 测试: 准备3个测试文件, a1,a2,a3, 其中a1没有rwx权限 ``` echo a1 > a1 cp a1 a2 cp a2 a3 chmod 000 a1 因为a1没有可读权限,所有cat a1的时候会打印错误信息 $ cat a* cat: a1: Permission denied a1 a1 $ cat a* 2> stderr.txt a1 a1 cat stderr.txt cat: a1: Permission denied ``` 当对stderr stdout重定向时, 被重定向的内容输出到文件中后就不能通过管道符`|`传递给后面的命令 但是可以通过tee来实现这个功能,tee接收stdin的同时还可以输出到stdout,传递给后续命令 ``` $ cat a* | tee out.txt | cat -n cat: a1: Permission denied 1 a1 2 a1 ``` 也可以使用/dev/stderr /dev/stdout / dev/stdin 表示标准错误,标准输出,标准输入 将文件重定向到命令: cmd < file