Comment signaler le time et d'autres informations sur toutes les commands bash?

La plupart des choses que je cours dans le terminal prennent beaucoup de time à calculer et j'aimerais que bash produise un rapport de time à la fin de chaque command input dans le terminal. Y at-il quelque chose que je peux mettre dans mon bashrc pour faire ceci?

Exemple:

$ find / -ls <find / -ls return info> start time = 10:21:54 | end time = 10:31:34 | time lapsed = 00:10:20 $ 

ou

 $ make all <make all return info> start time = 10:21:54 | end time = 10:31:34 | time lapsed = 00:10:20 

Ce serait bien de pouvoir append une list d'exceptions pour les commands comme cd, mais ça ne me dérangerait pas vraiment.

J'ai essayé ce qui suit dans mon .bashrc :

 echo -ne "$PS1" while IFS= read -er line;do eval "time $line" echo -ne "$PS1" done 

Cela fait à peu près ce que vous voulez avec plusieurs mises en garde:

  • Votre invite est pratiquement ruinée (la coquille interprète généralement des séquences comme \W et ainsi de suite dans votre invite avant de l'écho).
  • Vous perdez les capacités d'édition en command line (par exemple, vous ne pouvez pas utiliser CTRL + L pour clear ).
  • Probablement plusieurs autres.

Je suppose qu'un bon compromis serait de permettre cela sélectivement via une fonction shell:

 timed_commands() { [ "$1" = off ] && exec bash PS1='$ ' # Put something simple here while IFS= read -erp "$PS1" line;do eval "time $line" done } 

Activez-le avec timed_commands et désactivez-le avec timed_commands off

Merci au commentaire de @ jthill pour le commutateur -e à read .

maintenant c'est hackish comme tout l'enfer mais ça peut marcher …

définissez la string d'identification du terminal (la string renvoyée par inquire) à "time". remarquez l'espace de fuite. Ensuite, définissez votre invite pour terminer par un interroger. maintenant chaque fois que votre invite est affichée, le terminal tape automatiquement le time et un espace pour vous, à quel point vous tapez votre command. cela ne fonctionnera pas avec tous les terminaux car beaucoup ont désactivé cette fonctionnalité pour éviter que cela se produise.

Pour que cela fonctionne avec xterm, ajoutez la ligne suivante à votre .Xresources et rechargez-la avec xrdb

 xterm*answerbackSsortingng: time ^[0D^[0A URxvt*answerbackSsortingng: time ^[0D^[0A xterm_color*answerbackSsortingng: time ^[0D^[0A 

où ^ [est une évasion (parce que xterm n'aime pas l'espace à la fin de la string de réponse, je remue le slider.

ajoutez ensuite l'ENQ à la fin de votre string d'invite (exemple spécifique de bash):

 PS1="${PS1}\[\005\]" 

commencer une nouvelle coquille dans un xterm frais et croiser les doigts, cela devrait fonctionner. le \ 005 est un ENQ le [et] dit bash que le \ 005 ne bouge pas le slider.