这道题可以用一条命令看出候选人是否真正理解Linux命令行的文件描述符与流向。
核心判断管道符“|”默认连接左侧进程的标准输出stdout到右侧进程的标准输入stdin,并不会自动把stderr也送过去。
0101 / 最小例子
执行 make 2>&1 | grep -i error 时,先让make的标准错误重定向到当时的标准输出,再由管道接入grep;如果仅写 make | grep -i error,默认只过滤标准输出。
0202 / 为什么重定向顺序有差别
cmd >out.log 2>&1:先把stdout指向文件,再让stderr复制stdout当前位置,因此两者都进文件。cmd 2>&1 >out.log:先让stderr复制原stdout(通常是终端),随后才把stdout指向文件,因此stderr仍可能打印在终端。
0303 / 生产环境注意事项
管道调试既要关注stderr是否进入下游,也要关注退出码。默认Shell中流水线退出状态通常取最后命令;Bash可用 set -o pipefail 避免前面的失败被末尾成功掩盖。日志量大时还需考虑缓冲行为。
0404 / 面试参考回答
“我先确认错误日志究竟走stdout、stderr还是服务自己的日志系统;对于Shell流水线明确处理2号文件描述符,必要时启用pipefail,并用最小命令复现重定向顺序。”
看到 2>&1 不能机械解释成“两个文件合并”,它是对文件描述符的复制重定向,顺序很重要。
为什么执行 cmd | tee out.log 时,有些报错没有写进out.log?

扫码关注






























