目录

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