file1 >& file2"与 "{ > file1; } >& file2"的影响)-6ren"> file1 >& file2"与 "{ > file1; } >& file2"的影响)-请考虑以下 bash 脚本: #!/bin/bash touch ./temp set -C >./temp &>/dev/null # Visible error message outp-6ren">
gpt4 book ai didi

bash - 了解花括号对重定向 ("> file1 >& file2"与 "{ > file1; } >& file2"的影响)

转载 作者:行者123 更新时间:2023-12-04 02:29:55 31 4
gpt4 key购买 nike

请考虑以下 bash 脚本:

#!/bin/bash

touch ./temp

set -C

>./temp &>/dev/null # Visible error message output ("./test7: line 7: ./temp: cannot overwrite existing file")

{ >./temp; } &>/dev/null # No error message

有人能解释一下为什么倒数第二行中的重定向导致的错误消息没有被尾随的 &>/dev/null 抑制,而它按预期工作最后一行?

我研究了 bash 手册中关于重定向和复合命令的段落(特别是关于组命令的部分),但无法从中做出解释。毕竟,由于大括号中只有一个命令,所以将大括号去掉应该不会有任何改变,不是吗?区别是否与 bash 解析行的顺序有关?

最佳答案

根据 bash 手册(man bash):

Redirections are processed in the order they appear, from left to right. [...] Note that the order of redirections is significant.

对于 > temp >&/dev/null,当 bash 处理 > temp 部分时,stderr 仍然指向 tty,因此您可以看到错误。你可以这样验证:

[STEP 101] $ set -C
[STEP 102] $ date >> temp
[STEP 103] $
[STEP 104] $ > temp
bash: temp: cannot overwrite existing file
[STEP 105] $ > temp >& /dev/null
bash: temp: cannot overwrite existing file
[STEP 106] $
[STEP 107] $ >& /dev/null > temp
[STEP 108] $ 2> /dev/null > temp
[STEP 109] $

对于 { > temp; } &>/dev/null, { > temp; 作为复合命令处理,其输出作为一个整体由 &>/dev/null 重定向。

关于bash - 了解花括号对重定向 ("> file1 >& file2"与 "{ > file1; } >& file2"的影响),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64873636/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com