Shell重定向&>file、2>&1、1>&2的区别

shell上:
0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中


用例子说话:


1. grep da * 1>&2 
2. rm -f $(find / -name core) &> /dev/null
上面两例中的 & 如何理解,&不是放到后台执行吗?

牛解:

1.&>file或n>&m均是一个独立的重定向符号,不要分开来理解。

2.明确文件和文件描述符的区别。

3.&>file表示重定向标准输出和错误到文件
例如:
rm -f $(find / -name core) &> /dev/null,/dev/null是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉。

4.n>&m表示使文件描述符n成为输出文件描述符m的副本。这样做的好处是,有的时候你查找文件的时候很容易产生无用的信息,如:2> /dev/null的作用就是不显示标准错误输出;另外当你运行某些命令的时候,出错信息也许很重要,便于你检查是哪出了毛病,如:2>&1
例如:
注意,为了方便理解,必须设置一个环境使得执行grep da *命令会有正常输出和错误输出,然后分别使用下面的命令生成三个文件:
grep da * > greplog1
grep da * > greplog2 1>&2   
grep da * > greplog3 2>&1  //grep da * 2> greplog4 1>&2 结果一样
#查看greplog1会发现里面只有正常输出内容
#查看greplog2会发现里面什么都没有

#查看greplog3会发现里面既有正常输出内容又有错误输出内容

<think>好的,我现在要回答用户关于Bash Shell重定向中`&>`和`2>&1`的区别的问题。首先,我需要回忆一下自己之前学过的Shell重定向知识,确保理解正确。然后,结合用户提供的引用内容,特别是引用[1]提到的`2>&1`,以及可能的其他资源,比如引用[2]中的资源导航网站,可能需要查阅相关资料确认细节。 首先,用户的问题是关于`&>`和`2>&1`的用法或区别。我需要明确这两个操作符的作用以及它们在不同情况下的行为。 我记得在Bash中,重定向标准输出和标准错误的方法有两种:一种是使用`&>`,另一种是使用`>`和`2>&1`的组合。例如,`command &> file`会将标准输出和标准错误都重定向到file,而`command > file 2>&1`也是同样的效果。不过,可能有些细微的差别需要注意,比如顺序问题或者不同Shell版本的支持情况。 接下来,我需要确认这两种语法在不同上下文中的行为是否完全一致。比如,在仅使用`>`时,标准错误是否会被捕获,或者需要显式地将标准错误重定向到标准输出。例如,`2>&1`的作用是将标准错误的文件描述符(2)复制为标准输出(1)的当前目标。因此,顺序很重要,如果先执行`2>&1`再重定向标准输出,结果会不同。比如: command >file 2>&1 # 标准输出和错误都到file command 2>&1 >file # 标准错误到原来的标准输出(可能终端),标准输出到file 而`&>`则是同时重定向两个输出流到同一个文件,顺序可能不影响,因为它是一次性处理。例如: command &> file # 等同于 >file 2>&1 但需要确认Bash版本是否支持`&>`,比如旧版本可能不支持,而新版本支持。此外,是否还有其他区别,比如在追加模式下的使用,例如`&>>`是否存在,或者是否需要使用`>> file 2>&1`。 根据用户提供的引用[1]中提到:“bash sees the second redirection 2>&1. We haven't seen this redirection before. This one duplicates file descriptor 2 to be a copy of file descriptor 1”,这解释了`2>&1`的作用是将文件描述符2复制为文件描述符1的副本,即标准错误输出到标准输出的目标位置。 现在需要比较`&>`和`2>&1`的使用场景和区别。可能`&>`是Bash的简写方式,而`2>&1`是POSIX兼容的语法,可以在其他Shell中使用。此外,`&>`是否在覆盖和追加模式下的行为是否一致,例如`&>>`是否等同于`>> file 2>&1`。 另外,可能要注意到`&>`在某些情况下可能存在优先级问题,或者处理方式的不同。例如,`command &> file`相当于同时重定向stdout和stderr到file,而`command >file 2>&1`则是先重定向stdout到file,再将stderr重定向到stdout的位置,即file。 因此,两者的结果相同,但语法不同。`&>`更简洁,但可能不是所有Shell都支持,而`2>&1`是更传统且广泛支持的方法。 接下来需要整理这些点,确保回答准确,并且引用用户提供的引用内容。例如,引用[1]解释了`2>&1`的作用,而引用[2]可能提供的资源可以作为补充。 可能还需要指出何时使用哪一种,例如在编写可移植脚本时使用`>file 2>&1`,而在Bash脚本中可以使用更简洁的`&>`。 另外,可能存在的常见错误,例如顺序错误导致的重定向失败,比如`2>&1 >file`会将stderr重定向到当前的stdout(可能是终端),然后再将stdout重定向到file,此时stderr仍然输出到终端,而stdout到file。这需要特别强调顺序的重要性。 总结来说,回答需要包括: 1. 解释`&>`和`2>&1`的作用和用法。 2. 两者的区别,包括语法、兼容性、顺序问题。 3. 示例说明两者的正确使用方式。 4. 引用用户提供的引用内容来支持解释。 在编写过程中,需要确保符合用户给的系统级指令,比如行内数学表达式使用$...$,但这里可能用不上。独立公式可能也不需要。重点是正确的LaTeX语法,但此处主要涉及代码块和普通文本。使用中文回答,结构清晰,分点说明,并生成相关问题。 最后,生成的相关问题需要与主题相关,比如: 1. 如何在Bash中仅重定向标准错误? 2. 为什么在重定向时顺序很重要? 3. `&>`在哪些Shell中可用? 4. 如何将标准输出和错误追加到同一文件? 需要确保问题有意义,并且能够帮助用户进一步理解主题。</think>在Bash Shell中,`&>`和`2>&1`均用于同时重定向标准输出(stdout)和标准错误(stderr),但它们的语法和兼容性存在差异。 ### 1. **`&>`的用法** - **作用**:`command &> file`会将stdout和stderr同时重定向到`file`,覆盖文件原有内容。若需追加,可使用`&>>`(仅Bash 4及以上支持)[^1]。 - **示例**: ```bash ls non_existent_file &> output.log # stdout和stderr均写入output.log ``` ### 2. **`2>&1`的用法** - **作用**:`command >file 2>&1`通过两步操作实现相同效果: 1. `>file`将stdout重定向到`file`; 2. `2>&1`将stderr复制到stdout的目标(即`file`)[^1]。 若顺序颠倒(如`2>&1 >file`),则stderr会输出到原stdout的位置(如终端),而stdout重定向到文件。 - **示例**: ```bash ls non_existent_file > output.log 2>&1 # 正确顺序 ``` ### 3. **主要区别** | 特性 | `&>` | `2>&1` | |---------------|---------------------|------------------------| | **语法简洁性** | 更简洁 | 需分步操作 | | **兼容性** | 仅Bash支持 | POSIX兼容,所有Shell支持 | | **追加模式** | 需用`&>>`(Bash 4+)| 需用`>> file 2>&1` | ### 4. **典型错误示例** ```bash # 错误:stderr仍输出到终端 command 2>&1 >file # 正确:stdout和stderr均写入file command >file 2>&1 ``` ### 5. **应用场景** - **`&>`**:适合Bash脚本中简化代码。 - **`2>&1`**:需兼容其他Shell(如sh)时使用。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值