文件重定向
- 标准输入文件(stdin):键盘 FD0 (FD:文件描述符)
- 标准输出文件(stdout):显示器 FD1
- 标准错误文件(stderr):显示器 FD2
输入,输出,错误重定向本文不再叙述,可参考输出,输出,错误重定向
文件描述符复制
除了上面提到的默认的文件描述符外,我们也可以使用文件描述符复制>&
来自定义文件描述符:
exec 3>&1 1>temp.txt
echo "Hello World" # 显示器上并不会有输出
cat temp.txt # 数据到了文件里
Hello World
exec 1>&3
echo "Hello World"
Hello World
上例中,我们通过复制FD1,自定义了FD3,FD3具有和FD1相同的数据流指向,即显示器;之后重定向了FD1,使其指向了temp.txt文件,所以当执行第一句echo指令时,显示器上并不会展示,因为数据流流向了temp.txt文件;然后我们又通过FD复制,将FD1指向FD3,此时数据流流向FD3指向的目标,即显示器,需要解释一下的是,因为FD1是原本就存在的,所以此时的复制功能更接近于重定向,之后的echo语句,则会在显示器上输出。
注意
文件描述符复制符号两侧只能是文件描述符,一下下是非法展示
exec 3>&temp.txt
>&-
作用是删除自定义的文件描述符,如
exec 3>&1 # 根据FD1,复制FD3
exec 3>&- # 删除FD3
exec操作文件描述符
exec命令可以操作文件描述符,而且使用exec操作文件描述符所进行的文件重定向,作用域是全局的。
exec 1>test.txt;echo "Hello World" # no show
echo "Hello World" # also no show
exec 1>/dev/tty
echo "Hello World"
Hello World
上例中,通过exec操作FD1后,接下来使用echo都不会输出到显示器上,之后再次通过exec重定向后,才会输出到显示器上。
与之相对应的是,若在指令后嵌入重定向操作,则重定向的作用域只有本条指令。
echo "Hello World" >test.txt
echo "Hello World"
Hell World
&>file
此符号的作用是标准输出和标注错误都写入文件,与下面语句等价:
exec >file 2>&1
注意,顺序不能反,为什么自己想一想!