我有这个运行Scala测试代码的bash代码:
scripts=(
Hello.scala
)
for script in "${scripts[@]}"; do
echo scala "${script}"
scala -nocompdaemon "${script}" > >(tee -a _testoutput.txt) \
2> >(tee -a _testerrors.txt >&2)
done
如何解释>(tee -a _testoutput.txt)
?我通常使用|
(管道)来使用tee,使用这个表达式的区别是什么?
答案 0 :(得分:4)
在这种情况下,我相信> >(tee -a _testoutput.txt)
和| tee -a _testoutput.txt
的行为相同。
标准错误版本显然是必要的,因为没有stderr
管道。
管道版本与Process Substitution
(>(...)
)版本之间的另一个主要区别是子shell发生的位置。
例如,如果>(...)
在整个循环中,并且您需要在循环中设置的变量在循环之外保留,则无法使用管道版本执行此操作(请参阅{{3关于这个的更多信息)。
CharlesDuffy正确指出的另一个区别是,管道会影响管道的退出状态(默认情况下,虽然set -o pipefail
更改了管道,但仍会在管道中获得最终命令的退出状态PIPESTATUS
数组包含所有退出状态)。另一方面,过程替换不会影响退出状态。
答案 1 :(得分:3)
>( list )
被称为"流程替换"。它比普通管道更强大:您无法使用|
将标准输出和标准错误重定向到不同的程序。