linux重定向本质是通过文件描述符0(stdin)、1(stdout)、2(stderr)精准控制数据流向:0默认读键盘,用或>>重定向;2输出错误信息,须显式用2>或2>>重定向,且2>&1合并时顺序不可颠倒。

Linux 运维中,日志管理离不开对标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的精准控制。重定向不是简单地“把输出塞进文件”,而是通过文件描述符(0/1/2)明确数据流向,让日志可分、可追、可屏蔽、可合并。
理解三个通道:0、1、2 是关键
每个命令启动时,系统默认打开三个通道:
-
0(stdin):默认从键盘读取,重定向用
或 <code>0,比如 <code>cat -
1(stdout):正常执行结果,重定向用
>(覆盖)或>>(追加),如date > time.log -
2(stderr):报错信息(如
No such file),重定向必须显式写2>或2>>,否则错误仍打屏
常见日志重定向写法与实际用途
运维中写脚本或定时任务时,这些组合最常用:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
command > app.log 2>&1:把 stdout 和 stderr 都写进app.log,2>&1表示“把 2 号通道复制到 1 号当前指向的位置”——注意顺序不能颠倒,> app.log必须在前 -
command >> app.log 2>&1:追加写入,适合长期运行服务的日志累积 -
command > out.log 2> err.log:分离记录,便于单独分析成功输出与失败原因 -
command > /dev/null 2>&1:彻底静默,常用于 crontab 中避免无意义邮件告警 -
command 2> /dev/null:只屏蔽错误,保留正常输出(比如忽略某些非关键警告)
安全写法:避免清空重要日志
用 > 时会清空目标文件,一不小心可能删掉正在追踪的日志。建议:
- 日常调试优先用
>>,尤其对nohup.out或自定义日志 - 想清空日志文件,直接用
> logfile(不带命令),比echo "" > logfile更轻量可靠 - 生产环境脚本中,加判断或时间戳前缀,例如:
date +%F_%H:%M | tee -a run.log && your_cmd >> run.log 2>&1
验证与排错小技巧
重定向出问题?试试这几个方法:
- 用
ls /missing 2>&1 | cat -n看错误是否真被捕获(行号能确认是否进管道) - 检查文件描述符状态:
lsof -p $PID | grep -E "(txt|DEL|pipe)" - 临时测试重定向效果:
echo "test" > /tmp/test && echo "err" 1>&2 2> /tmp/test && cat /tmp/test——你会看到只有test,因为1>&2把 stdout 指向了 stderr,而 stderr 被重定向到文件,但没生效(顺序和逻辑需厘清)










