错误重定向无反应的根本原因是命令未产生stderr;2>覆盖写适合调试,2>>追加写适合长期监控;合并stdout和stderr需用>&或2>&1避免错乱;丢弃输出应使用>/dev/null或&>/dev/null。

CentOS 7怎么修改错误输出重定向

错误输出重定向为什么总是没反应

经常会遇到这样的情况:执行 command 2> error.log 后,error.log 却是空的,或者命令明明报错了,却没有写入到这个文件中。这可不是因为语法错误,而是另有原因:命令根本就没有产生 stderr——比如说,ls /valid/path 执行成功时,是不会往 fd 2 输出任何东西的;只有像 ls /noexist 这种真正执行失败的命令,才会让 2> 起作用。

验证方式很简单:echo "test" 2> out.txt 不会写入(因为 echo 从不写 stderr),但 ls /xxx 2> out.txt 会写入错误信息。

2>2>> 怎么选

覆盖写还是追加写,取决于日志用途:

把 stdout 和 stderr 合并写入同一个文件要注意顺序

直接写 command > all.log 2> all.log 是错的:两股流竞争写入,内容会错乱(比如“Permission”和“denied”被拆开写在不同位置)。

正确做法只有两种:

注意:2>&1 必须写在 > 之后,顺序反了(如 2>&1 > all.log)会导致 stderr 仍输出到终端。

丢弃错误输出就用 /dev/null

不想保存错误、也不让它干扰终端,直接扔进黑洞:

真正容易被忽略的是:/dev/null 不是“文件”,而是一个内核设备节点,写进去的东西瞬间蒸发,不占磁盘,也不触发 I/O 错误 —— 这正是它比创建空文件再重定向更可靠的原因。

本文转载于:https://www.php.cn/faq/3026158.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。