Si je comprends bien, vous recherchez l'équivalent de tee file1 file2 file3
, mais plutôt que d'écrire les mêmes données dans trois fichiers file1
, file2
et file3
, vous voulez diriger les mêmes données dans trois commandes cmd1
, cmd2
et cmd3
, c.-à-d.
… | ??? cmd1 cmd2 cmd3
devrait être équivalent à
… | cmd1 &
… | cmd2 &
… | cmd3 &
sauf que …
cela ne serait exécuté qu'une seule fois.
Il y a deux façons de procéder.
Ksh93, bash et zsh prennent en charge la substitution de processus . Il s'agit d'une généralisation des canaux qui permet à l'argument d'une commande d'être un fichier qui, lorsqu'il est écrit, transmet des données en entrée à une commande (il existe également la variante d'entrée qui, lorsqu'elle est lue, obtient les données sorties par une commande) . C'est,
echo hello | tee >(cmd1)
imprime hello
sur la sortie standard et fonctionne en plus cmd1
avec hello
comme entrée.
Ainsi, par exemple, si vous souhaitez dupliquer l'entrée de somecommand
et la transmettre aux deux cmd1
et cmd2
, vous pouvez utiliser
somecommand | tee >(cmd1) | cmd2
Si votre shell ne prend pas en charge la substitution de processus, vous pouvez utiliser des canaux nommés à la place. Voir la réponse d' Arcege pour savoir comment cela fonctionne. Les canaux nommés sont moins pratiques que la substitution de processus car vous devez les créer et les supprimer, puis démarrer et synchroniser les processus manuellement. Ils ont l'avantage d'être entièrement portables, alors que tous les shells ne prennent pas en charge les substitutions de processus. Ils peuvent également être utilisés dans des scénarios autres que ceux pour lesquels la substitution de processus est prévue.
Sous le capot, sur certains systèmes, la substitution de processus utilise des canaux nommés en interne. Sur la plupart des systèmes, cependant, il repose sur des fichiers nommés représentant des descripteurs de fichiers .