Supposons que j'ai un binaire appelé foo
.
Si je veux rediriger la sortie de foo
vers un autre processus bar
, je pourrais écrire ./foo | bar
.
D'autre part, si je voulais time
foo, et rediriger la sortie que time
je pourrais écrire, time (./foo) | bar
.
Ma question est, comment puis-je coller la sortie de time
à la fin de la sortie de foo
et la diriger à travers le même tuyau ?
La solution suivante n'est pas celle que je recherche, car elle démarre deux instances distinctes du processus bar
, alors que je veux un seul canal partagé, vers une seule instance de bar
.
time (./foo | bar) | bar
Pour tous ceux qui sont curieux, la raison de ne pas vouloir démarrer deux instances de bar
est parce que bar
peut être un client réseau et je veux que les informations de synchronisation soient envoyées au serveur dans le cadre du même http POST
message que la sortie du processus.
la source
Réponses:
Si je comprends ce que vous demandez, je le ferai. J'utilise les commandes
ls ~
ettee
comme remplaçants pour./foo
etbar
, mais la forme générale de ce que vous voulez est la suivante:REMARQUE: La sortie de
time
est déjà attachée à la fin de toute sortie de./foo
, elle est en train de le faire sur STDERR. Pour le rediriger à travers le tube, vous devez combiner STDERR avec STDOUT. Vous pouvez utiliser soit|&
ou2>&1
pour le faire.Exemple
Et voici le contenu du fichier
cmd.log
produit partee
.la source
time
envoie sa sortie à stderr au lieu de stdout par défaut. Vous avez juste besoin de rediriger cela où vous le souhaitez.Vous dites "d'autre part, si je voulais
time
tromper et rediriger la sortie detime
je pourrais écrire,.time (./foo) | bar
" mais c'est en fait incorrect. Dans ce cas, la sortie de l'heure serait toujours affichée sur votre console, seule la sortie standard serait redirigée.Vous pouvez rediriger stderr spécifiquement avec:
ou tous les tuyaux avec:
Les supports sont nécessaires pour que cela fonctionne correctement.
la source
J'ai trouvé que cela fonctionne sur Solaris.
(time ls) &> file
la source