GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisation de modificateurs de mots avec l'historique Bash sous Linux

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. ]


Linux
  1. Comment effacer l'historique de Bash sous Linux

  2. Utiliser Word Wrap avec Mc ?

  3. Utilisation de la commande Linux Sleep dans les scripts Bash

  4. Utilisation de la commande Linux Basename dans les scripts Bash

  5. Exemple d'utilisation de canaux nommés dans Linux Bash

Commande d'historique sous Linux avec des exemples

Comment activer l'horodatage dans l'historique de Bash sous Linux

La commande Bash Echo expliquée avec des exemples sous Linux

Planifier des travaux sous Linux avec la commande 'at'

Utilisation de la commande Linux Dirname dans les scripts Bash

Comment effacer l'historique de Bash sous Linux et Mac