《Classic Shell Scripting》:文件描述符处理

在系统内部,UNIX是以一个小的整数数字,称为文件描述符(file descriptors),表示每个进程打开的文件。数字由零开始,至多到系统定义的打开文件数目的限制。传统上,Shell允许你直接处理至多10个打开文件:文件描述符从0至9(POSIX标准将是否可以处理大于9的文件描述符,保留给各实现自行定义,bash可以,但ksh则否)

文件描述符0,1与2,各自对应到标准输入,标准输出以及标准错误输出。最常见的操作便是变更这三个文件描述符其中一个的位置,不过也可能处理其他的变动。首先来看的是:将程序的标准输出传送到一个文件,并将起标准错误信息传到另一个文件:

make 1> results 2> ERRS

上面的命令是将make的标准输出(文件描述符为1)传给results,并将标准错误输出(文件描述符为2)传给ERRS。

make 1> results 2> /dev/null

1> results里的1其实没有必要,供输出重定向的默认文件描述符是标准输出:也就是文件描述符1。下个例子会将输出与错误信息送给相同的文件:

make > results 2>&1

需特别留意的一点是:在命令行上,这4个字符2>&1必须连在一起,中间不能有任何空格。

在此,顺序格外重要,Shell处理重定向时,由左至右。