Vos options ici vont dépendre de votre shell. En - zsh
il une fonction de crochet pratique appelée preexec()
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ée precmd()
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'aide precmd()
et le sortir avant l'invite ou l'enregistrer. Exemple:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
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.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
Dans une implémentation plus pratique de preexec()
, je l'utilise pour voir si le shell s'exécute à l'intérieur tmux
ou screen
, 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.
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.