`我正在阅读https://stackoverflow.com/questions/692000/how-do-i-write-standard-error-to-a-file-while-using-tee-with-a-pipe/692009#692009、https://stackoverflow.com/a/14737103/5499118的答案:
{ { ./aaa.sh | tee bbb.out; } 2>&1 1>&3 | tee ccc.out; } 3>&1 1>&2
正如我所检查的,它按照解释的那样工作,答案链接到https://unix.stackexchange.com/a/18904/266260,而后者链接到https://unix.stackexchange.com/a/3540/266260。
我不明白为什么{ ... 1>&3 ... } 3>&1
会起作用(后面的重定向如何逆转前者的效果),因为当我想了解 man bash 时:
请注意,重定向的顺序很重要。例如,命令
ls > dirlist 2>&1
将标准输出和标准错误定向到文件 dirlist,而命令
ls 2>&1 > dirlist
仅将标准输出定向到文件 dirlist,因为在将标准输出重定向到 dirlist 之前,标准错误已从标准输出复制。
我发现重定向中的文件描述符重复:
重定向是通过 dup 系列系统函数实现的。dup 是“duplication”的缩写,例如:
3>&2
您将文件描述符 2 复制(dup2)到文件描述符 3 上...
因此我理解1>&3
将 3 重复为 1,并且从该命令开始它们指向同一个对象。man dup
:
成功返回后,新旧文件描述符可以互换使用。它们指向同一个打开的文件描述符
从dup
解释上看,我预计3>&1
不会有任何变化,因为 3 和 1 已经相同了。但显然情况并非如此,因为3>&1
省略{ { ./aaa.sh | tee bbb.out; } 2>&1 1>&3 | tee ccc.out; } 3>&1 1>&2
结果bash: 3: bad file descriptor
在解释使用调用进行重定向时,哪些地方(如果有的话)是错误的dup
?在1>&3
和期间内部发生了什么3>&1
?也许{ }
在这里很重要,但我发现它们仅用于分组,并且每个man bash
:
list 只是在当前 shell 环境中执行。