Shell中的>/dev/null 2>&1 与 2>&1 >/dev/null 与&>/dev/null 的区别

默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入)、标准输出(输出到屏幕)、标准错误(也是输出到屏幕),它们分别对应的文件描述符是0,1,2 。那么我们来看看下面的几种重定向方法的区别:

>/dev/null 2>&1 

//  实际上,应该等同于这样: 1>/dev/null 2>/dev/null ,默认情况下就是1,标准输出,所以一般都省略。 而&符号,后面接的是必须的文件描述符。不能写成2>1,这样就成了标准错误重定向到文件名为1的文件中了,而不是重定向标准错误到标准输出中。所以这里就是:标准输出重定向到了/dev/null,而标准错误又重定向到了标准输出,所以就成了标准输出和标准错误都重定向到了/dev/null

2>&1 >/dev/null 

// 咋一看,这个跟上面那个有啥区别呢,不也是标准错误重定向到标准输出,而标准输出重定向到/dev/null么? 最后不应该都重定向/dev/null么? 我是这么理解的!一条指令同一时刻要么产生标准错误,要么产生标准输出。 当产出标准错误的时候,因这个标准错误重定向到了标准输出,而标准输出是输出到屏幕。这个时候标准输出还没有被重定向到/dev/null,于是在屏幕上打印了。当产生标准输出时,那么它就不是标准错误,2>&1无效,于是标准输出重定向dev/null,不打印到屏幕。所以最终结果将是:标准错误打印到屏幕,而标准输出不打印到屏幕。

-------------

2016-01-22 更新

突然看到N年前的博客, 才发现错误百出.更新下, 以免误人, 事实上, 命令行的重定向什么的, 是在执行命令之前就准备好了的. 解释顺序从左至右依次进行, 2>&1 ,而1是屏幕, 所以标准错误重定向到屏幕, 再而 1>/dev/null , 即标准输出重定向到 /dev/null, 上述2>&1 >/dev/null  并不是什么同一时刻要么产生标准输出要么产生标准错误. 而是两个不同的东西.

以以下变量的方式做个解释,就很明显了,这两种方式是不同的,前者就像:

a=1

b=a

而后者就像:

b=a

a=1

&>/dev/null

// 这个就是,不管你是啥玩意儿文件描述符,通通重定向到/dev/null

<think>好的,我需要解释shell1>/dev/null2>&1>/dev/null区别及用法。首先,我得回顾一下用户提供的引用内容,确保自己理解正确。 根据引用[4],1>用于重定向标准输出2>用于标准错误。而/dev/null是一个丢弃数据的特殊文件。用户的问题是关于这两个命令的区别,特别是1>/dev/null2>&1>/dev/null。 首先看第一个命令1>/dev/null。这应该是指将标准输出重定向到/dev/null,也就是丢弃正常输出,但标准错误仍然会显示在终端。例如,执行命令时如果有错误信息,还是会看到。 然后是第二个命令2>&1>/dev/null。这里可能有些混淆,因为shell中的重定向顺序很重要。正确的写法应该是2>&1,但用户可能写错了顺序。根据引用中的例子,正确的形式应该是command >/dev/null 2>&1,这表示先将标准输出重定向到/dev/null,然后将标准错误重定向标准输出,也就是同样丢弃错误输出。而如果写成2>&1>/dev/null,实际上是先将标准错误重定向标准输出(此时标准输出还是终端),然后将标准输出重定向到/dev/null。这样错误信息可能仍然会显示,因为标准错误重定向时指向的是原来的标准输出(终端),之后标准输出重定向,但标准错误已经指向了旧的输出,所以错误信息不会被丢弃。 所以区别在于顺序的不同导致的结果不同。用户可能误用了顺序,导致错误处理不符合预期。需要解释正确的用法,比如>file 2>&12>&1 >file的区别,以及为何前者正确,后者错误。 另外,引用中提到的例子表格显示,命令> /dev/null 2>&1会丢弃所有输出,而2>&1 > /dev/null则只会丢弃标准输出错误输出仍然显示在屏幕上。这进一步验证了顺序的重要性。 因此,总结两者的区别1>/dev/null仅丢弃标准输出错误保留;而正确写法的2>&1>/dev/null其实是顺序错误,正确的应该是command >/dev/null 2>&1,此时两者都被丢弃。而用户提到的2>&1>/dev/null可能实际效果是错误未被丢弃。 需要提醒用户注意重定向的顺序,以及正确使用语法,避免误解。</think>在Shell中,`1>/dev/null`和`2>&1>/dev/null`的区别主要体现在**重定向的顺序**和**作用对象**上。以下是详细解释: --- ### **1. `1>/dev/null` 的作用** - **功能**:将标准输出(stdout)重定向“黑洞”`/dev/null`,即**丢弃所有正常输出**。 - **语法等价**:`>/dev/null`(默认省略了`1>`)。 - **示例**: ```bash ls /tmp 1>/dev/null # 正确输出被丢弃,错误输出(如文件不存在)仍显示在屏幕 ``` --- ### **2. `2>&1>/dev/null` 的误解正确用法** #### **常见误解** - **错误写法**:`2>&1>/dev/null`会被Shell解析为`2>&1`和`>/dev/null`的组合,但**顺序导致逻辑错误**。 - **实际效果**: 1. 先将标准错误(stderr)重定向到当前的标准输出(默认是屏幕)。 2. 再将标准输出(stdout)重定向到`/dev/null`。 - **结果**:正常输出被丢弃,但错误输出仍然显示在屏幕。 #### **正确用法** - **正确写法**:`>/dev/null 2>&1` 1. 先将标准输出重定向到`/dev/null`。 2. 再将标准错误重定向到当前的标准输出(此时已指向`/dev/null`)。 - **结果**:**正常输出和错误输出均被丢弃**。 ```bash ls /nonexistent >/dev/null 2>&1 # 所有输出均被丢弃 ``` --- ### **关键区别总结** | 命令格式 | 标准输出(stdout) | 标准错误(stderr) | 实际效果 | |-------------------|--------------------|--------------------|------------------------------| | `1>/dev/null` | 丢弃 | 保留(显示在屏幕) | 仅隐藏正常输出 | | `>/dev/null 2>&1` | 丢弃 | 丢弃 | 完全静默执行 | | `2>&1 >/dev/null` | 丢弃 | 保留(显示在屏幕) | 错误输出未被正确重定向[^1] | --- ### **应用场景** 1. **仅隐藏正常输出**:`1>/dev/null` ```bash cronjob脚本中,若只需记录错误日志: backup.sh >/dev/null ``` 2. **完全静默执行**:`>/dev/null 2>&1` ```bash 安全脚本中,避免任何输出暴露信息: rm -rf /tmp/* >/dev/null 2>&1 ``` 3. **分离输出错误**: ```bash 将正常输出写入日志,错误丢弃: compile.sh >build.log 2>/dev/null ``` --- ### **常见问题** 1. **为什么顺序影响结果?** Shell解析重定向时**从左到右执行**。`2>&1`会将错误指向当前标准输出,若后续修改标准输出错误流的指向不会自动更新[^2]。 2. **如何同时重定向到文件和黑洞?** ```bash command >output.log 2>/dev/null # 正常输出写入文件,错误丢弃 ``` --- **总结**:重定向顺序至关重要。若需完全静默命令,优先使用`>/dev/null 2>&1`[^4]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值