> (tee -a …) commande dans bash

J’ai ce code bash qui exécute le code de test Scala:

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 

Comment interpréter >(tee -a _testoutput.txt) ? J’utilise normalement | (pipe) pour utiliser le tee, quelle est la différence en utilisant cette expression?

Dans ce cas, je crois > >(tee -a _testoutput.txt) et | tee -a _testoutput.txt | tee -a _testoutput.txt se comporterait de manière identique.

La version standard de l’erreur est évidemment nécessaire car il n’y a pas de tuyau en stderr .

L’autre différence principale entre la version de tuyau et la version de Process Substitution ( >(...) ) est l’endroit où le sous-shell se produit.

Si, par exemple, le >(...) était sur la boucle entière et que les variables définies dans la boucle devaient persister en dehors de la boucle, vous ne pouviez pas faire cela avec la version de tuyau (voir BashFAQ 24 pour plus d’informations) .

Une différence supplémentaire, soulignée correctement par CharlesDuffy, est qu’un tube affecte le statut de sortie du pipeline (par défaut, vous obtenez le statut de sortie de la commande finale dans le pipeline bien que set -o pipefail modifie et le tableau bash PIPESTATUS des statuts de sortie). La substitution de processus, par contre, n’affecte pas le statut de sortie.

>( list ) s’appelle “substitution de processus”. C’est plus puissant qu’un tuyau normal: vous ne pouvez pas utiliser | redirect si facilement la sortie standard et l’erreur standard vers différents programmes.