Linux shell中的File Descripter可以理解为一个指向文件的指针。默认有三个FD:0,1,2。分别指向的是:Keyboard设备文件,Moniter设备文件,和Moniter设备文件。
Shell中还允许有3..9的FD,默认都没有打开,可以认为指向的为null。
可以通过一下命令查看得开的FD:
ls /proc/self/fd
返回的数字代表FD的值。
利用重定向可以为一个FD赋值,使其指向一个非null的文件,其实就是打开一个FD。
6>&1
可以理解为将FD6指针指向FD1指针指向的文件,既Moniter。这样,FD6和FD1就同时指向同一个文件:Moniter。
6>&-
可以理解为将FD6指针置为空值null,即关闭FD6。
一个重定向只在当前命令中有效。用过exec可以是IO重定向在当前shell中长期有效。
通过类似指针的特性,I/O重定向可以用来保存当前某个FD并在其后恢复。例如:
过滤stderr中的内容,屏蔽含有字符串“unused”的错误输出:
# 创建FD6,指向FD1指向的moniter。
exec 6>&1
# 运行command命令,将stdout重定向给FD6,再将stderr重定向给stdout。
# 这时,command有两个输出FD,
# 分别是FD1和FD6,FD1是错误信息,FD6是标准输出内容。
# 再将FD1错误信息通过pipe传给grep进行过滤,并将过滤后的内容重定向给FD2。
# 最后,将之前的FD6的内容重定向给FD1。
# 这样,这条命令有两个输出,FD1是command的标准输出内容,
# FD2是经过过滤的command的错误输出。
(command 2>&1 >&6 | grep -v unused >&2) 6>&1
# 关闭FD6。
exec 6>&-