← 全部文章

技术与生活 / 一篇记录

2>&1 放在哪里,结果为什么不同

重定向表达式按照书写顺序处理。把标准错误连接到标准输出时,连接的是那个时刻的目标;之后再改变标准输出的去处,并不一定改变先前建立的关系。

先明确这里的区别

文件描述符从左到右处理,相同符号换一个位置可能得到不同结果。

以下示例使用 Bash,请在独立测试目录中理解输入、输出和退出码。

sh -c 'echo out; echo err >&2' > demo.log 2>&1

怎样判断处理正确

确认 demo.log 同时包含标准输出和错误输出。

分别运行两种重定向顺序,对照终端与文件内容。管道中的错误输出也需要单独考虑,不能看到日志文件存在就认为所有异常都保存了。

实验时可以让子进程分别向两个通道打印不同标签,再更换重定向顺序。不要仅根据终端有没有文字判断;打开输出文件核对内容,才能确认两个描述符最终指向哪里。

需要留意的是,在生产脚本中覆盖日志前,先确认目标文件路径。

参考:Shell 文档。

搜索文章

输入关键词,找回一篇记录。