5.2. 高级重定向特性

5.2.1. 文件描述符的使用

I/O 有三种类型,每种类型都有自己的标识符,称为文件描述符

在以下描述中,如果省略文件描述符编号,并且重定向运算符的第一个字符是 <,则重定向指的是标准输入(文件描述符 0)。如果重定向运算符的第一个字符是 >,则重定向指的是标准输出(文件描述符 1)。

一些实际的例子将使这一点更清楚

ls >dirlist 2>&1

将把标准输出和标准错误都定向到文件dirlist,而命令

ls 2>&1 >dirlist

将仅将标准输出定向到dirlist。 这对于程序员来说可能是一个有用的选项。

事情变得相当复杂了,不要将此处的 & 符号的用法与 4.1.2.1 节 中 & 符号的用法混淆,在 4.1.2.1 节中,& 符号用于在后台运行进程。 在这里,它仅仅表示后面的数字不是文件名,而是数据流指向的位置。 另请注意,大于号不应与文件描述符的数字用空格隔开。 如果用空格隔开,我们将再次将输出指向一个文件。 下面的例子证明了这一点

[nancy@asus /var/tmp]$ ls 2> tmp

[nancy@asus /var/tmp]$ ls -l tmp
-rw-rw-r--  1 nancy nancy 0 Sept  7 12:58 tmp

[nancy@asus /var/tmp]$ ls 2 > tmp
ls: 2: No such file or directory

nancy 执行的第一个命令是正确的(即使没有生成错误,因此标准错误重定向到的文件是空的)。 第二个命令期望2是一个文件名,但在本例中不存在,因此显示错误。

所有这些特性都在 Bash Info 页面中详细解释。

5.2.2. 示例

5.2.2.1. 分析错误

如果你的进程产生大量错误,这是一种彻底检查它们的方法

command 2>&1 | less

这通常用于在使用 make 命令创建新软件时,例如在

andy:~/newsoft> make all 2>&1 | less
--output ommitted--

5.2.2.2. 将标准输出与标准错误分离

程序员经常使用像这样的结构,以便在一个终端窗口中显示输出,在另一个终端窗口中显示错误。 首先使用 tty 命令找出你正在使用的伪终端

andy:~/newsoft> make all 2> /dev/pts/7

5.2.2.3. 同时写入输出和文件

你可以使用 tee 命令将输入复制到标准输出以及一个或多个输出文件,一步到位。 使用-atee 的选项 -a 会导致将输入追加到文件。 如果你想同时查看和保存输出,此命令非常有用。 >>> 运算符不允许同时执行这两个操作。

这个工具通常通过管道 (|) 调用,如下例所示

mireille ~/test> date | tee file1 file2
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> cat file1
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> cat file2
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> uptime | tee -a file2
 11:10:51 up 21 days, 21:21, 57 users,  load average: 0.04, 0.16, 0.26

mireille ~/test> cat file2
Thu Jun 10 11:10:34 CEST 2004
 11:10:51 up 21 days, 21:21, 57 users,  load average: 0.04, 0.16, 0.26