Comment faire en sorte que la fonction de temps linux préfixe la sortie d'une commande au lieu de placer la sortie après la commande?

2
~$ /usr/bin/time -f "%e: " echo test
test
0.00: 

Je veux que la sortie soit

0.00: test

Comment pourrais-je accomplir ceci?


la source
Cela n'a pas de sens. Vous ne savez pas combien de temps la commande a pris jusqu'à ce qu'elle ait exécuté toutes ses sorties.
Neil
/ usr / bin / time -f "% e:" test d'écho & gt; so 2 & gt; se; echo $ (

Réponses:

6

Sauf si vous demandez une forme de voyage dans le temps, vous devez capturer le résultat et le réorganiser. time affiche son résultat en erreur standard.

$ /usr/bin/time -f "%e: " echo test >so 2>se; echo $(<se) $(<so)
0.01: test
geekosaur
la source
1
Vous êtes un ninja shell. Merci.
Comment pourrais-je faire cela dans un fichier make? Je voulais envelopper "CXX = g ++"
C'est en fait une question assez différente, comme g++ enverra n'importe quelle sortie (puisqu'elle ne produira qu'une sortie en cas d'erreur) à stderr. C'est assez complexe pour que vous souhaitiez utiliser un script wrapper. En outre, envisagez-vous d’emballer la sortie (normalement inexistante) de g++, ou la commande en écho de make? Ce dernier ne peut pas être fait facilement en faisant écho à la commande réelle.
geekosaur
N'importe quoi. Je viens de me rendre compte que la sortie ne venait pas de gcc, mais du fichier make. Vous avez raison. Quand il compile main.cpp, il sort "main.cpp", comment ferais-je "0:04: main.cpp", quelque chose comme ça?
1
C'est plus compliqué, car la macro n'a pas accès au nom de fichier que vous voulez faire écho. vous devez remplacer le make règles de modèle. Voir gnu.org/software/make/manual/make.html#Pattern-Rules pour gmake; c'est pareil pour d'autres versions de make bien que les détails spécifiques seront différents.
geekosaur
1

Comme le dit la réponse de geekosaur, le temps est imprimé sur stderr et votre commande sur stdout. Et le temps attend la fin de votre commande avant d'écrire sa sortie. Je pense que vous devriez essayer le programme sponge du paquet moreutils, comme ça:

/usr/bin/time -f "%e: " echo test | sponge

Sponge est un programme qui absorbe toute l’entrée et l’écrit à la fermeture de l’entrée (c’est-à-dire que le programme précédent se termine). Ce qui précède fonctionne parce que le temps s’imprimera sur stderr lorsque l’écho sera terminé et que sa sortie standard sera absorbée par l’éponge, qui ne s’effacera que lorsque le côté gauche sera terminé. Autant que je sache, cela correspond à peu près à ce que vous voulez, bien que je n’aie pas pu le tester avec une exactitude totale, car le système / usr / bin / time de mon système ne prend pas en charge l’option -f.

John Zwinck
la source
Notre système de construction risque de paniquer s’il voit une sterror.
Vous pouvez ajouter une redirection vers stdout à la fin: (/usr/bin/time echo test | sponge) 2>&1
John Zwinck
0

Je ne pense pas que ce soit possible. Une façon de le faire est de capturer la sortie dans une variable et de la manipuler.


la source
2
Je n'ai pas demandé si c'était possible, j'ai demandé comment le faire.