Pour autant que je sache, je peux utiliser la commande tee pour diviser la sortie standard sur l'écran et d'autres fichiers:
command -option1 -option2 argument | tee file1 file2 file3
Est-il possible de rediriger la sortie vers des commandes au lieu de fichiers en utilisant tee, afin que je puisse théoriquement créer une chaîne de commandes?
command-line
pipe
tee
Abdul Al Hazred
la source
la source
Réponses:
Vous pouvez utiliser des canaux nommés ( http://linux.die.net/man/1/mkfifo ) sur la ligne de commande de
tee
et faire lire les commandes sur les canaux nommés.Une fois
command
terminé,tee
fermera les canaux nommés, ce qui signalera une EOF (lecture de 0 octet) sur chacun d'eux, ce/tmp/dataN
qui mettrait normalement fin auxcmdN
processus. Exemple réel:En raison des processus d'arrière-plan, le shell a renvoyé une invite avant la sortie du programme. Les trois instances se sont
wc
terminées normalement.la source
/tmp/data/{0,1,2}
. Là encore, dans bash, vous pouvez utiliser la substitution de processus et ignorermkfifo
entièrementSi 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 fichiersfile1
,file2
etfile3
, vous voulez diriger les mêmes données dans trois commandescmd1
,cmd2
etcmd3
, c.-à-d.devrait être équivalent à
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,
imprime
hello
sur la sortie standard et fonctionne en pluscmd1
avechello
comme entrée.Ainsi, par exemple, si vous souhaitez dupliquer l'entrée de
somecommand
et la transmettre aux deuxcmd1
etcmd2
, vous pouvez utiliserSi 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 .
la source
pee
demoreutils
.Au moins dans bash, vous pouvez ignorer la
mkfifo
substitution de processus:ou pour reprendre l'exemple d'Arcege
la source
Je suis surpris que personne n'ait mentionné la
pee
commande de moreutils ( https://joeyh.name/code/moreutils ).la source