在这种情况下,我认为> >(tee -a _testoutput.txt)
和| tee -a _testoutput.txt
的行为是相同的。
显然需要标准错误版本,因为没有标准错误管道。
管道版本和过程替换(>(...)
)版本之间的另一个主要区别是子shell发生的位置。
例如,如果>(...)
适用于整个循环,并且您需要在循环中设置的变量持续存在于循环外部,则无法使用管道版本(有关此更多信息,请参见Bash FAQ 24)。
另一个不同之处,正如Charles Duffy所指出的, 是管道会影响管道的退出状态(默认情况下,您会得到管道中最后一个命令的退出状态,尽管set -o pipefail
会改变这一点,而Bash PIPESTATUS
数组包含所有退出状态)。另一方面,进程替换不会影响退出状态。
>( list )
被称为 "进程置换"。它比普通管道更强大: 你不能轻松地使用 |
将标准输出和标准错误重定向到不同的程序中。
2>&7
等命令是可以的。已更新。 - choroba
> >(tee -a foo)
不会改变退出状态,而| tee -a foo
会。 - Charles Duffy{ sleep 1; echo a; } > >(:)
。 - gniourf_gniourf