技术与生活 / 一篇记录
2>&1 放在哪里,结果为什么不同
重定向表达式按照书写顺序处理。把标准错误连接到标准输出时,连接的是那个时刻的目标;之后再改变标准输出的去处,并不一定改变先前建立的关系。
先明确这里的区别
文件描述符从左到右处理,相同符号换一个位置可能得到不同结果。
以下示例使用 Bash,请在独立测试目录中理解输入、输出和退出码。
sh -c 'echo out; echo err >&2' > demo.log 2>&1
怎样判断处理正确
确认 demo.log 同时包含标准输出和错误输出。
分别运行两种重定向顺序,对照终端与文件内容。管道中的错误输出也需要单独考虑,不能看到日志文件存在就认为所有异常都保存了。
实验时可以让子进程分别向两个通道打印不同标签,再更换重定向顺序。不要仅根据终端有没有文字判断;打开输出文件核对内容,才能确认两个描述符最终指向哪里。
需要留意的是,在生产脚本中覆盖日志前,先确认目标文件路径。
参考:Shell 文档。