既然输出到文件拉,为什么还需要2>dev/null呢,可以去掉吗?为什么?
可以去掉,命令依然能够正常运行,但执行时的体验会变差。
之所以在输出到文件时依然建议保留2>/dev/null,是因为:正常结果(Stdout)和报错信息(Stderr)是两条完全独立的通道。
如果你去掉了2>/dev/null,会发生以下情况:
1. 去掉后的实际现象
- 文件里:依然只有干净、正确的日志搜索结果(因为
>默认只把通道 1 的正常结果写入文件)。 - 屏幕上(终端):会弹出一堆类似
grep: ... Permission denied或No such file的报错信息。
2. 为什么会这样?(原理分析)
在 Linux 中,命令运行时会产生两个出口:
- 通道 1 (Stdout / 正常输出):这是
grep找到的代码行。 - 通道 2 (Stderr / 错误输出):这是
grep遇到权限不足或找不到文件时产生的抱怨。
当你写> file.txt时,其实等同于1> file.txt(只把通道 1 重定向到文件)。
通道 2(报错)此时依然无处可去,默认会直接输出到你的屏幕上。
| 命令写法 | 正常结果去哪了? | 报错信息去哪了? | 屏幕上会看到什么? |
|---|---|---|---|
保留2>/dev/null > file.txt | 写入file.txt | 扔进黑洞(消失) | 完全干净,什么都不显示 |
去掉后> file.txt | 写入file.txt | 输出到屏幕上 | 满屏幕的 Permission denied 报错 |
总结
- 如果你不想在终端屏幕上看到任何刺眼的报错提示,希望执行时静默且优雅,就不能去掉
2>/dev/null。 - 如果你不介意终端屏幕上被报错信息刷屏,只关心最终生成的文件对不对,那么可以去掉。
