Dans mon article, Parsing Bash history, j'ai montré comment référencer des éléments dans votre shell history
par numéro de ligne ainsi que par position de mot. Une fois que vous avez maîtrisé l'analyse de l'history
de Bash par index de lignes et de mots, vous pouvez bénéficier des modificateurs disponibles pour l'history
commande.
L'option de shell hisexpand
Avant de discuter de l'history
l'analyse, il convient de mentionner que le point d'exclamation (!
) la notation n'est disponible que pour votre shell Bash grâce au histexpand
option. Parce que histexpand
est activé par défaut, de nombreux utilisateurs ne lui accordent jamais beaucoup d'attention. Cependant, c'est l'option qui force l'expansion d'un !
à la liste de l'history
entrées.
Si l'option est désactivée, vous perdez cette fonctionnalité. Par exemple :
$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo
Généralement, histexpand
est activé par défaut, sauf dans les shells non interactifs (par exemple, dans un script shell). Devrait history
la sténographie ne vous échoue jamais, vous pouvez soit activer histexpand
en tant qu'option shell ou bien utiliser l'history
complet commande impliquée par histexpand
:
$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo
Dans un script shell, vous devez activer history
et indiquez un emplacement où history
peut être sauvegardé :
HISTFILE=/tmp/history.log
set -o histexpand
set -e
## some code here
## clean up
rm /tmp/history.log
Un avantage à laisser histexpand
désactivé, c'est que vous perdez la verbosité des résultats de l'history
Actions. Par exemple, avec histexpand
activé, la première chose retournée à votre shell après un history
commande est la version étendue de ce qui est en cours d'exécution :
$ set -o histexpand
$ echo foo
foo
$ !!
echo foo
foo
Avec histexpand
désactivé, votre history
commande est plus longue, mais les résultats sont plus laconique :
$ set +o histexpand
$ echo foo
foo
$ !!
foo
Si vous trouvez une utilisation pour history
dans un script shell dépend de vous, mais history
les modificateurs ont des raccourcis intéressants qui les rendent particulièrement pratiques dans certains cas.
Modificateurs d'historique
Modificateurs de history
les sélections sont désignées par deux-points (:
) suivi d'un caractère modificateur. Certains modificateurs peuvent être combinés avec d'autres.
Suffixe de nom de fichier
Pour supprimer le suffixe d'un argument, utilisez le r
modificateur.
Ceci est similaire à basename
.
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tgz
-rw-r--r-- 1 0 Mar 9 11:23 aFileNameWith-a_complex-syntax-1.rev.tgz
$ echo !!:2:r
echo aLongFileNameWith-a_complex-syntax-1
aLongFileNameWith-a_complex-syntax-1
Le r
modificateur n'est pas super intelligent. Il trouve simplement le dernier point dans un nom de fichier et coupe le suffixe, qui peut parfois ne pas correspondre à ce que vous pensez être le suffixe du fichier, donc à certains égards, basename
offre une plus grande flexibilité.
$ set +o histexpand
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tar.gz
$ echo !!:2:r
aLongFileNameWith-a_complex-syntax-1.tar
Le résultat inverse peut être atteint avec le e
modificateur :
$ set +o histexpand
$ echo aLongFileNameWith-a_complex-syntax-1.tgz
aLongFileNameWith-a_complex-syntax-1.tgz
$ echo !!:2:e
.tgz
Noms de fichiers
Une version simplifiée de dirname
est disponible avec le h
modificateur :
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:h
src
Et l'autre côté de cette expression est disponible avec le t
modificateur :
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh
Substitution de chaîne
Peut-être le modificateur le plus largement utile de history
est la substitution de chaîne. Par exemple, n'importe quel administrateur d'un environnement mixte a tapé ceci dans une boîte Red Hat Enterprise Linux à un moment donné :
$ sudo apt install tmux
Une telle erreur est facile à corriger avec une substitution de chaîne :
$ ^apt^dnf
sudo dnf install tmux
Vous pouvez même ajouter certaines options :
$ ^apt^dnf -y
sudo dnf -y install tmux
Cet history
la syntaxe est un raccourci pour les s
modificateur. La syntaxe complète est, par exemple, !!:s/apt/dnf
et peut donc être utile pour les éléments plusieurs lignes en arrière dans votre history
. Supposons que vous ayez émis une commande utile trois commandes auparavant et que vous souhaitiez exécuter une commande similaire maintenant :
$ !-3:s/vi/emacs/
sudo dnf install -y emacs
Comme sed
, cette substitution par défaut ne se produit qu'une seule fois, mais vous pouvez la rendre globale (par rapport à la ligne que vous rappelez) avec le g
modificateur :
$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3
La sécurité d'abord :comment effectuer une simulation d'historique
En appuyant sur Return
après un history
modifié La ligne peut parfois être stressante, en particulier lorsque la ligne que vous souhaitez réexécuter est nichée entre des commandes particulièrement dangereuses ou affecte des fichiers importants. Si vous voulez vérifier la commande que vous êtes sur le point de modifier et d'exécuter, vous pouvez utiliser le p
modificateur à la fin d'un history
modification.
$ !-32:0-:s/mv/trash/:p
trash important.txt status.txt pay.txt
La commande que vous voyez en conséquence est l'élément développé de history
, mais il n'a pas encore été exécuté. Vous pouvez l'exécuter manuellement, en appuyant sur Up
flèche ou Ctrl+P
, maintenant qu'il a été résolu pour vous. Utilisation de la vérification (p
) est généralement une bonne idée si vous débutez dans l'utilisation de l'history
commande en production.
Conclusion
Votre historique Bash peut être utile pour beaucoup de choses, qu'il s'agisse de revenir sur ce que vous avez fait toute la journée ou simplement de rendre votre travail plus efficace en réutilisant des morceaux d'informations que vous avez déjà travaillé pour comprendre. Plus vous pratiquez avec les modificateurs d'historique, plus ils deviennent utiles. Permettez-vous de trébucher (avec précaution) sur certains au fur et à mesure que vous apprenez la syntaxe, et bientôt vous rappellerez des commandes et des arguments avec moins de touches que jamais auparavant.
[ Voulez-vous essayer Red Hat Enterprise Linux ? Télécharge le maintenant gratuitement. ]