文件描述符是与文件输入相关联的整数 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