bash中的>(tee -a ...)命令

时间:2015-03-11 16:27:12

标签: bash unix tee

我有这个运行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,使用这个表达式的区别是什么?

2 个答案:

答案 0 :(得分:4)

在这种情况下,我相信> >(tee -a _testoutput.txt)| tee -a _testoutput.txt的行为相同。

标准错误版本显然是必要的,因为没有stderr管道。

管道版本与Process Substitution>(...))版本之间的另一个主要区别是子shell发生的位置。

例如,如果>(...)在整个循环中,并且您需要在循环中设置的变量在循环之外保留,则无法使用管道版本执行此操作(请参阅{{3关于这个的更多信息)。

CharlesDuffy正确指出的另一个区别是,管道会影响管道的退出状态(默认情况下,虽然set -o pipefail更改了管道,但仍会在管道中获得最终命令的退出状态PIPESTATUS数组包含所有退出状态)。另一方面,过程替换不会影响退出状态。

答案 1 :(得分:3)

>( list )被称为"流程替换"。它比普通管道更强大:您无法使用|将标准输出和标准错误重定向到不同的程序。