欢迎各位兄弟 发布技术文章
这里的技术是共享的
2>&1,表示2的输出重定向等同于1
linux 下 command >/dev/null 2>&1 与 command 2>/dev/null 与 command &>/dev/null 区别
在Shell中,>/dev/null 2>&1、2>/dev/null和&>/dev/null都用于重定向命令的输出,但它们的行为有显著区别:
command >/dev/null 2>&1功能:
将标准输出(stdout)和标准错误(stderr)全部重定向到 /dev/null(即丢弃所有输出)。
解析顺序:
>/dev/null:先将stdout重定向到 /dev/null。
2>&1:再将stderr重定向到 当前stdout的目标(即 /dev/null)。
兼容性:
所有Shell(包括Bourne Shell、Bash等)均支持。
command 2>/dev/null功能:
仅将标准错误(stderr)重定向到 /dev/null,标准输出(stdout)仍然显示在终端。
常见用途:
隐藏错误信息,但保留正常输出(例如 grep "pattern" 2>/dev/null)。
command &>/dev/null 相当于 command >/dev/null 2>&1功能:
同时将stdout和stderr重定向到 /dev/null。
兼容性:
这是Bash的简写语法(部分其他Shell如Zsh也支持),但不兼容POSIX或古老的Shell(如sh)。
等效写法:> /dev/null 2>&1 的简化形式。
| 命令形式 | stdout处理 | stderr处理 | 兼容性 |
|---|---|---|---|
>/dev/null 2>&1 | 丢弃 | 丢弃 | 所有Shell |
2>/dev/null | 保留 | 丢弃 | 所有Shell |
&>/dev/null | 丢弃 | 丢弃 | 仅Bash/Zsh等 |
需要兼容性时(如脚本首行是 #!/bin/sh)→ 用 >/dev/null 2>&1。
仅需隐藏错误时 → 用 2>/dev/null。
明确使用Bash时 → &>/dev/null 更简洁。
bash# 生成stdout和stderr(替换为你的实际命令) ls exist_file nonexistent_file >/dev/null 2>&1 # 无任何输出 ls exist_file nonexistent_file 2>/dev/null # 仅显示exist_file ls exist_file nonexistent_file &>/dev/null # 无任何输出(Ba
linux 下 command 2>/dev/null 与 command 1>/dev/null 与 command >/dev/null 区别
在Shell中,文件描述符用于标识不同的输入/输出流,其中:
0: 标准输入(stdin)
1: 标准输出(stdout)
2: 标准错误(stderr)
command 2>/dev/null、1>/dev/null、和 >/dev/null 都涉及输出重定向,但它们的行为不同:
command 2>/dev/null作用:
仅重定向标准错误(stderr)到 /dev/null,即丢弃错误输出,但保留标准输出(stdout)。
示例:
bash# 假设 `nonexistent_file` 不存在 ls -l nonexistent_file 2>/dev/null
效果:
错误信息(例如 ls: cannot access 'nonexistent_file')被丢弃,不会显示。
如果命令有正常输出(例如 ls -l existent_file),仍然会显示在终端。
command 1>/dev/null作用:
仅重定向标准输出(stdout)到 /dev/null,即丢弃正常输出,但保留错误输出(stderr)。
等效简写:> /dev/null(见下方)。
示例:
bashls -l nonexistent_file 1>/dev/null
效果:
正常输出(如果有)被丢弃。
错误信息仍然显示(例如 ls: cannot access 'nonexistent_file')。
command >/dev/null 相当于 command 1>/dev/null 作用:
默认重定向标准输出(stdout) 到 /dev/null,即 等同于 1>/dev/null(在大多数Shell中)。
特殊说明:
在 Bash 中,>/dev/null 和 1>/dev/null 完全等价,因为 > 默认重定向文件描述符 1(stdout)。
示例:
bashls -l nonexistent_file >/dev/null
效果:
正常输出被丢弃。
错误信息 仍然显示。
| 命令形式 | stdout (正常输出) | stderr (错误输出) | 作用总结 |
|---|---|---|---|
2>/dev/null | 保留 | 丢弃 | 仅隐藏错误信息 |
1>/dev/null | 丢弃 | 保留 | 仅隐藏正常输出 |
>/dev/null | 丢弃 | 保留 | 1>/dev/null 的简写 |
只想看到错误信息,不管正确输出:
bashcommand 1>/dev/null # 或等效写法: command >/dev/null
只想看到正常输出,不管错误信息:
bashcommand 2>/dev/null
完全静默(丢弃全部输出):
bashcommand >/dev/null 2>&1 # 经典写法 command &>/dev/null # Bash 简洁写法
在特殊情况下,某些命令(如 grep)可能默认混合stdout & stderr,此时 2>/dev/null 仍需手动指定。
在 sh(非Bash Shell)中,&>/dev/null 有时不被支持,这时建议使用 >/dev/null 2>&1。
试试运行以下命令对比效果:
bashls existent_file nonexistent_file 2>/dev/null ls existent_file nonexistent_file 1>/dev/null ls existent_file nonexistent_file >/dev/null
有 command 2&>/dev/null 这种用法吗
没有,command 2&>/dev/null 是错误的语法,Shell 不会解析这种写法。正确的写法应该是:
command 2>/dev/null(只重定向 stderr)
command &>/dev/null(同时重定向 stdout 和 stderr,Bash/Zsh 等支持)
command >/dev/null 2>&1(经典写法,兼容所有 Shell)
有人可能会误解 &> 的语法,误以为可以单独控制 stderr 来使用 2&>,但实际上:
&>/dev/null 是 > /dev/null 2>&1 的 简洁写法(Bash/Zsh 等支持)。
2&> 不符合 Shell 重定向规范,会报错(如 bash: syntax error near unexpected token '&')。
stderr?如果你想 只重定向 stderr,必须使用:
bashcommand 2>/dev/null # 仅丢弃错误消息,正常输出仍然显示
而 同时重定向 stdout + stderr 时,可以用:
bashcommand &>/dev/null # Bash/Zsh 支持的写法(简洁) # 或 command >/dev/null 2>&1 # 兼容所有 Shell 的标准写法
运行以下命令测试:
bash# 测试错误命令(会输出 stderr) ls nonexistent_file 2&>/dev/null # 报错:语法错误 ls nonexistent_file 2>/dev/null # 正确:仅隐藏错误 ls nonexistent_file &>/dev/null # 正确:隐藏所有输出(Bash) ls nonexistent_file >/dev/null 2>&1 # 正确:隐藏所有输出(兼容所有 Shell)
❌ 错误写法:2&>/dev/null(无此语法)
✅ 正确方式:
单独 stderr → 2>/dev/null
全部输出 → &>/dev/null(Bash/Zsh)或 >/dev/null 2>&1(通用)