Sous bash, puis-je organiser une fonction juste avant d'exécuter une commande?
Il y en a $PROMPT_COMMAND
, qui est exécuté avant d'afficher une invite, c'est-à-dire juste après l'exécution d'une commande.
Bash $PROMPT_COMMAND
est analogue à la precmd
fonction de zsh ; donc ce que je recherche, c’est un équivalent bash de zsh preexec
.
Exemples d'applications: définissez le titre de votre terminal sur la commande en cours d'exécution; ajouter automatiquement time
avant chaque commande.
command-line
bash
hook
Gilles
la source
la source
PS0
variable qui agit commePS1
mais qui est utilisée après la lecture de la commande mais avant son exécution. Voir gnu.org/software/bash/manual/bashref.html#Bash-VariablesRéponses:
Pas nativement, mais on peut le pirater à l'aide du
DEBUG
piège. Ce code configurepreexec
etprecmd
fonctionne de manière similaire à zsh. La ligne de commande est transmise en tant qu’argument uniquepreexec
.Voici une version simplifiée du code pour configurer une
precmd
fonction qui est exécutée avant d’exécuter chaque commande.Cette astuce est due à Glyph Lefkowitz ; merci à bcat d' avoir localisé l'auteur original.
Modifier. Une version mise à jour du hack de Glyph peut être trouvée ici: https://github.com/rcaloras/bash-preexec
la source
"$BASH_COMMAND" = "$PROMPT_COMMAND"
comparaison ne fonctionne pas pour moi i.imgur.com/blneCdQ.pngtime for i in {1..10}; do true; done
prend 0,040 seconde normalement et 1 400 à 1 600 secondes après l'activation du piège DEBUG. La commande trap est exécutée deux fois par boucle - et sur Cygwin, le forking requis pour l'exécution de sed est excessivement lent à environ 0,030 seconde pour le forking seul (différence de vitesse entreecho
Builtin et/bin/echo
). Quelque chose à garder à l'esprit peut-être.PROMPT_COMMAND
variable (par exemple , délimitée par;
), vous devrez peut - être utiliser la correspondance de motif dans la deuxième ligne de lapreexec_invoke_exec
fonction, comme ceci:[[ "$PROMPT_COMMAND" =~ "$BASH_COMMAND" ]]
. C'est parce queBASH_COMMAND
représente chacune des commandes séparément.Vous pouvez utiliser la
trap
commande (depuishelp trap
):Par exemple, pour changer le titre du terminal de manière dynamique, vous pouvez utiliser:
De cette source.
la source
help trap
dit "Si un SIGNAL_SPEC est DEBUG, ARG est exécuté après chaque commande simple" [non souligné dans l'original].trap '[ -n "$COMP_LINE" ] && [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ] && date "+%X";echo -e "\e]0;$BASH_COMMAND\007"' DEBUG
. Cela place la commande dans le titre et affiche également l'heure actuelle juste avant chaque commande, mais ne le fait pas lors de l'exécution$PROMPT_COMMAND
.[ -z "$COMP_LINE" ]
.Ce n'est pas une fonction shell qui est exécutée, mais j'ai fourni une
$PS0
chaîne d'invite qui est affichée avant l'exécution de chaque commande. Détails ici: http://stromberg.dnsalias.org/~strombrg/PS0-prompt/$PS0
est inclus dansbash
4.4, bien que la plupart des Linux prennent un peu de temps pour inclure 4.4 - vous pouvez le construire vous-même si vous le souhaitez; dans ce cas, vous devriez probablement le mettre sous/usr/local
, l'ajouter à/etc/shells
etchsh
à celui-ci. Ensuite, déconnectez-vous et reconnectez-vous, peut-ssh
être par vous-même @ localhost ousu
par vous-même d'abord comme test.la source
J'ai récemment eu à résoudre ce problème exact pour un projet parallèle. J'ai créé une solution assez robuste et résiliente qui imite les fonctionnalités preexec et precmd de zsh pour bash.
https://github.com/rcaloras/bash-preexec
Il était à l'origine basé sur la solution de Glyph Lefkowitz, mais je l'ai amélioré et mis à jour. Heureux d'aider ou d'ajouter une fonctionnalité si nécessaire.
la source
Merci pour les conseils! J'ai fini par utiliser ceci:
Prendre plaisir!
la source
J'ai écrit une méthode pour consigner toutes les commandes / commandes intégrées dans un fichier texte ou un serveur 'syslog' sans utiliser de correctif ni d'exécutable spécial.
Il est très facile à déployer, car il s’agit d’un simple script shell qui doit être appelé une fois à l’initialisation du 'bash'.
Voir la méthode ici .
la source