I/O 有三种类型,每种类型都有自己的标识符,称为文件描述符
标准输入: 0
标准输出: 1
标准错误: 2
在以下描述中,如果省略文件描述符编号,并且重定向运算符的第一个字符是 <,则重定向指的是标准输入(文件描述符 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 页面中详细解释。
如果你的进程产生大量错误,这是一种彻底检查它们的方法
command 2>&1 | less
这通常用于在使用 make 命令创建新软件时,例如在
andy:~/newsoft> make all 2>&1 | less --output ommitted-- |
程序员经常使用像这样的结构,以便在一个终端窗口中显示输出,在另一个终端窗口中显示错误。 首先使用 tty 命令找出你正在使用的伪终端
andy:~/newsoft> make all 2> /dev/pts/7 |
你可以使用 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 |