Bash Shell输出和错误消息发送到同一文件

利用重定向,我们可以将输出或错误消息保存到单独的文件中,但如何将两者送往同一文件呢?

解决方案

用 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 是默认的,但是我们发现重定向文件描述符时,明明白白地写出数字,可读性会更好。

注意输出文件的内容顺序。有时候,错误消息在文件中出现的时间可能早于在屏幕上出现的时间。这与标准错误的无缓冲性质有关,当写入文件而不是屏幕时,这种现象会更加明显。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!