Une commande avant chaque commande bash

18

Quelqu'un connaît-il un moyen de mettre une commande «time» avant chaque commande dans une session bash?

jthoenes
la source
1
alors ... vous voulez ajouter automatiquement du «temps» à chaque ligne de commande?
Quack Quichote
1
oui, parfaitement ... pour la performance mesuarament évidemment
jthoenes

Réponses:

37

Désolé pour la mauvaise réponse avant, j'ai mal compris votre question.

Pour avoir le temps ajouté avant chaque commande que vous exécutez sur le shell, vous pouvez faire quelque chose comme ça

bind 'RETURN: "\e[1~time \e[4~\n"'

Cela va relier la touche de retour. Maintenant, chaque fois que vous appuyez sur retour au lieu d'écrire un retour à la ligne \ n, il ira au début de la ligne, entrez le texte "temps" et un espace, ira à la fin de la ligne et entrez le retour à la ligne \ n produisant ainsi le résultat souhaité effet.

Si vous ne voulez pas sacrifier votre clé d'entrée, vous pouvez créer une `` deuxième '' clé de référence, comme F12 en liant la commande comme ceci

bind '"\e[24~": "\e[1~time \e[4~\n"'

Maintenant, au lieu de remplacer la touche retour, vous avez lié F12.

Le fond de tout cela est que bash utilise GNU readline pour lire les commandes. Ainsi, readline serait un bon point de départ pour une manipulation ultérieure des commandes, etc.

Lukas Loesche
la source
1
+1 belle solution! j'aime l'idée d'avoir une clé d'entrée d'analyse comparative distincte de la clé d'entrée régulière.
Quack Quichotte
c'est une idée intelligente. Comment pouvez-vous le généraliser pour exécuter une fonction définie par l'utilisateur avant chaque commande? Je ne sais pas comment combiner le code bash et une fonction readline dans la même liaison.
Gilles 'SO- arrête d'être méchant'
Cela ne fonctionnera-t-il pas sur Mac? J'ai exécuté la commande dans le terminal et ma touche Entrée ne semble plus rien faire maintenant.
akki
6

Je me rends compte que cela sort du cadre de cette question mais ...

Dans zsh(qui, à ma connaissance, est un super ensemble de bash) si vous définissez la variable suivante dans votre .zshrcfichier:

export REPORTTIME=5

Chaque commande qui dure plus de 5 secondes (je suis presque sûr) affichera la sortie de time. Toutes les commandes qui s'exécutent plus rapidement ne le font pas. Et dans ces cas, on s'en fout vraiment, donc c'est bien de ne pas encombrer les choses. Il existe également de nombreuses autres fonctionnalités intéressantes zshque vous pourriez apprécier pendant que vous y êtes.

tychoish
la source
Bon conseil. Alors que zsh a sûrement un sur-ensemble de la fonctionnalité de bash , sa syntaxe n'est pas un sur-ensemble de la syntaxe de bash , donc ce n'est pas un remplacement "drop in".
Chris Johnsen
1

Incluez \ t dans votre chaîne d'invite. Il inclura l'heure dans votre invite au moment où vous l'incluez. Voir: http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

JRobert
la source
Il s'agit de l'heure actuelle au moment de la génération de l'invite, et non du temps nécessaire à l'exécution de la commande précédente.
pause jusqu'à nouvel ordre.
Vrai; et la différence entre cela et l'heure actuelle de l'invite suivante est le temps d'exécution (moins le temps de frappe, bien sûr - le collage est votre ami ici). Aucune réaffectation de clés nécessaire.
JRobert
0

La PS1 semble être la façon standard de faire quelque chose comme ça.

Jason Sundram
la source
2
Il modifie l'affichage, pas la commande réellement exécutée.
user1686
@grawity C'est vrai - mais cela vous donnerait exactement ce que vous voulez ... le temps ajouté à chaque ligne.
Jason Sundram
3
Ce qui est complètement différent de ce qui le timefait (il mesure le temps nécessaire à l'exécution d'une commande).
user1686
@Grawity, je suppose que vous avez raison - vous devez faire la soustraction vous-même. On dirait que @Jrobert a eu la même idée.
Jason Sundram