2014年8月8日星期五

Linux_079:输入和输出(三)

环境:RHEL 7.1 或 MAC 10.11.6

3. 文件描述符
当执行任意一个命令时,三个文件被打开和该命令相关联,这三个文件都用一个叫做文件描述符的整数来表示。
标准输入 STDIN 0。
标准输出 STDOUT 1。
标准错误 STDERR 2。
通常这些文件是和用户的终端关联在一起的,但是也可以将它们重定向到其它的文件。

3.1 把文件描述符和文件关联
当你需要把输入和输出重定向到一个文件很多次,而你又不愿意重复输入文件名很多次时,把文件描述符和文件关联是很有用的。
exec n>file
exec n>>file
比如:exec 4>fd4.out
警告,使用 STDOUT 输出的重定向时要小心,比如 exec 1 > fd1.out,会把 STDOUT 重定向到文件 fd1.out,这样所有命令的输出都将被放到 fd1.out 中,在你的终端上将看不到任何输出。

要打开一个文件来读,可以使用
exec n<file
比如:// TODO

3.2 输入/输出重定向

3.2.1 重定向标准输出和标准错误到不同的文件
(1)cmd n>file
(2)cmd n>>file
(3)cmd n(4)cmd 1>file1 2>file2
通常标准输出的文件描述符 1 是被省略的,因此命令可以简化为 cmd > file1 2>file2。

3.2.2 重定向标准输出和标准错误到同一个文件
cmd > file 2>&1
list > file 2>&1
说明:&[n] 代表是已经存在的文件描述符,&1 代表输出,&2 代表错误输出,&- 代表关闭与它绑定的描述符。
(1)重定向标准输出到标准错误
比如:cat foo 1>&2
(2)重定向标准错误到标准输出
比如:cat foo 2>&1
(3)重定向标准输出和标准错误到同一个文件
cat foo > foo.txt 2>&1
先把标准输出重定向到文件,再把标准错误输出到标准输出,因为标准输出已经重定向到文件,所以标准错误与重定向到文件。

3.2.3 重定向两个文件描述符
(1)重定向一个文件描述符的输出到另一个文件描述符:n>&m
(2)复制一个已经打开的输出文件描述符:exec n>&m,这里 m 是一个已经打开的文件描述符,n 是一个新文件描述符。
比如:
exec 4>out.txt
exec 5>&4

4. 关闭文件描述符
当一个文件描述符被关闭后,对该文件描述符的读和写操作都将导致错误。
n>&-
exec n>-
比如:先将错误输出信息关闭掉,然后再输出到 /dev/null
ls test.sh test1.sh 2>&-
ls test.sh test1.sh 2>/dev/null

参考文献:
1. 《精通 shell 编程(第二版)》

没有评论: