Est-il possible d'ajouter de force un alias de synchronisation (faute d'un meilleur moyen de le formuler) à chaque commande bash
?
Par exemple, j'aimerais avoir un utilisateur spécifique qui, chaque fois qu'une commande est exécutée, est toujours encapsulé avec date
avant et après, ou time
.
Est-ce possible, et si oui comment?
preexec
, mais vous ne voulez pas l'exécuter à l'intérieur depreexec
(par exemplepreexec() { time $1; }
), car le shell l'exécute toujours après lespreexec
retours. Le mieux que nous puissions faire est donc quelque chose de similaire.preexec()
fonction pour envelopper ce qui était en cours d'exécution en récupérant la commande, en l'exécutant vous-même depuis l'intérieur de la fonction, puis en retournant une sorte d'erreur afin que le shell ne continue pas à exécuter la commande elle-même.Réponses:
Vous pouvez enregistrer l'heure à laquelle une ligne de commande démarre et l'heure à laquelle une invite s'affiche. Bash garde déjà une trace de la date de début de chaque ligne de commande dans son historique, et vous pouvez noter l'heure lorsque vous affichez l'invite suivante.
Cela ne vous donne qu'une deuxième résolution, et seulement l'heure de l'horloge murale. Si vous souhaitez une meilleure résolution, vous devez utiliser une
date
commande externe qui prend en charge le%N
format des nanosecondes et leDEBUG
piège à appelerdate
avant d'exécuter la commande à temps.Même avec le
DEBUG
piège, je ne pense pas qu'il existe un moyen d'afficher automatiquement les temps processeur pour chaque commande, ou d'être plus discriminant que d'invite à invite.Si vous êtes prêt à utiliser un autre shell, voici comment obtenir un rapport de temps pour chaque commande dans zsh (cela ne se généralise pas à d'autres tâches):
Vous pouvez définir
REPORTTIME
n'importe quelle valeur entière, les informations de synchronisation ne seront affichées que pour les commandes qui ont utilisé plus de ce nombre de secondes de temps processeur.Zsh a pris cette fonctionnalité de csh où la variable est appelée
time
.la source
Vos options ici vont dépendre de votre shell. En -
zsh
il une fonction de crochet pratique appeléepreexec()
qui est exécuté juste avant que les commandes de shell interactives. En créant une fonction avec ce nom, vous pouvez provoquer l'exécution de choses. Vous pouvez également effectuer un suivi avec une fonction appeléeprecmd()
qui s'exécutera juste avant que l'invite suivante ne soit dessinée, qui sera juste après la fin de votre commande.En créant cette paire de fonctions, vous pouvez exécuter toutes les commandes arbitraires que vous souhaitez exécuter avant et après les commandes émises à l'invite. Vous pouvez l'utiliser pour enregistrer l'utilisation du shell, créer des verrous, tester l'environnement ou, comme dans votre exemple, calculer le temps ou les ressources dépensés pendant l'exécution d'une commande.
Dans cet exemple, nous allons créer nous-mêmes un horodatage de référence avant d'exécuter une commande à l'aide
preexec()
puis calculer le temps passé à exécuter la commande à l'aideprecmd()
et le sortir avant l'invite ou l'enregistrer. Exemple:Remarque: Pour cet exemple particulier, il existe une fonction intégrée encore plus simple. Tout ce que vous avez à faire est d'activer les rapports d'exécution dans ZSH et il le fera automatiquement.
Dans une implémentation plus pratique de
preexec()
, je l'utilise pour voir si le shell s'exécute à l'intérieurtmux
ouscreen
, si c'est le cas, pour envoyer des informations sur la commande en cours d'exécution en amont à afficher dans le nom de l'onglet.Malheureusement en bash ce petit mécanisme n'existe pas. Voici la tentative d' un homme de le reproduire . Voir également la réponse de Gilles pour un petit hack astucieux similaire.
la source
Le moyen le plus simple serait probablement de définir
PROMPT_COMMAND
. Voir Variables Bash :Par exemple, pour éviter d'écraser une commande d'invite existante, vous pouvez faire:
la source
csh
/tcsh
a le meilleur support pour cette fonctionnalité (et l'a toujours eu).En d'autres termes,
set time=1
affichera le temps consommé (système, utilisateur, écoulé) par toute commande qui a pris plus d'une seconde de temps processeur. Plainset time
permettra d'imprimer l'heure de toutes les commandes.la source