利用重定向,我们可以将输出或错误消息保存到单独的文件中,但如何将两者送往同一文件呢?
解决方案
用 shell 语法将标准错误消息重定向到和标准输出相同的地方。
首选:
both >& outfile
或者:
both &> outfile
又或者老式且略烦琐(但可移植性更好)的写法:
both > outfile 2>&1
其中,both 是准备向 STDERR 和 STDOUT 生成输出的(假想)程序。
讨论
&>
和 >&
只是将 STDOUT 和 STDERR 发送到相同地方(这正是我们想做的)的便捷写法。
在第三个示例中,1 用作重定向的目标,但是 >&
将 1 解释为文件描述符。实际上,2>&1
是一个实体(其中不允许出现空格),表示标准错误(2)会被重定向(>
)到随后的文件描述符(&)1。2>&
必须作为整体出现,不能夹杂空格;否则,2 就成了另一个参数,而 &
代表与其表面完全不同的含义(与在后台运行命令有关)。
不妨认为所有的重定向操作符都带有一个前导数字(如 2>
),而 >(标准输出的文件描述符)的默认数字为 1。
尽管可读性会略差,你也可以按照其他顺序进行重定向,将标准输出的指向重定向到与标准错误相同的地方(实际上,使用管道就必须这么做):
both 2> outfile 1>&2
1 代表标准输出,2 代表标准错误。我们本可以将最后一个重定向写作 >&2
,因为对于 >
而言,1 是默认的,但是我们发现重定向文件描述符时,明明白白地写出数字,可读性会更好。
注意输出文件的内容顺序。有时候,错误消息在文件中出现的时间可能早于在屏幕上出现的时间。这与标准错误的无缓冲性质有关,当写入文件而不是屏幕时,这种现象会更加明显。
酷客网相关文章:
评论前必须登录!
注册