web-dev-qa-db-fra.com

Comprendre le point d'exclamation (!) Dans bash

J'ai utilisé

history | less

pour obtenir les lignes des commandes précédentes et à partir des chiffres sur le côté gauche, j'ai trouvé la ligne que je voulais répéter (par exemple, 22) et l'ai fait

!22

à l'invite de commande et cela a fonctionné - en exécutant l'ensemble de commandes sur la ligne que j'ai faite à ce moment-là. Je ne peux pas savoir où le point d'exclamation est utilisé, que représente-t-il en termes d'actions entreprises par bash et où l'utiliser. Dans la documentation, je ne vois pas d'explication "tangible".

112
Vass

! est une fonctionnalité qui est apparue à l'origine dans C Shell , à l'époque où vous pouviez compter sur les terminaux pour avoir des touches fléchées. C'est particulièrement utile si vous ajoutez le numéro de commande actuel à l'invite (PS1="\!$ ") afin que vous puissiez rapidement regarder votre écran pour obtenir les numéros des commandes passées.

Maintenant que vous pouvez utiliser les touches fléchées et des choses comme Ctrl-R pour rechercher l'historique des commandes, je ne vois pas beaucoup d'utilisation de la fonctionnalité.

Une variante de celui-ci que vous pourriez trouver utile est !!, qui réexécute la commande précédente. À lui seul, je ne trouve pas !!Enter plus vite que juste Enter, mais il peut être utile lorsqu'il est combiné dans une commande plus importante.

Exemple: Un système courant erreur pilote sur Sudo est à oublier le préfixe Sudo sur une commande qui nécessite des privilèges supplémentaires. Un novice retape toute la commande. L'élève assidu édite la commande à partir de l'historique des commandes du Shell. L'éclairé tape Sudo !!.

Bash vous permet de désactiver ! traitement dans le shell avec set +o histexpand ou set +H. Vous pouvez le désactiver dans Zsh avec set -K.

157
Warren Young

S'il n'y a pas de réponse plus longue ici, il y en a certainement une sur Super User, puisque j'en ai lu une récemment. Dans la page de manuel bash vous pouvez trouver une énorme section intitulée EXPANSION D'HISTOIRE sur la question.

Vous pouvez faire un hôte entier plus que simplement exécuter la dernière commande ou le numéro de commande X. Vous pouvez faire des choses comme !cat pour exécuter la dernière commande commençant par cat. Ou !?bash?:s/bash/csh/ exécute la dernière commande contenant bash mais la remplace par csh.

52
Cry Havok

Beaucoup plus peut être fait avec ! tel que:

  • exécuter une commande qui est tapée avant 3 commandes: !-3
  • exécuter une commande qui commence par !ls

et beaucoup plus. Voir 15 exemples d'extension d'historique de Bash Linux que vous devriez connaître

40
user379997

Bien sûr, vous pouvez faire !! pour réutiliser la dernière commande dans bash Shell. Et puis il y a !$ pour réutiliser la dernière partie de votre dernière commande.

par exemple. voir un fichier

less path/to/your/file.txt

Si vous souhaitez maintenant modifier le même fichier, vous pouvez utiliser !$ pour obtenir uniquement le chemin du fichier à partir de la dernière commande

vim !$

ÉDITER:

Vous pouvez utiliser tous les arguments de la commande précédente avec !*

par exemple: cela créera des fichiers et les supprimera tous

$ touch a.txt b.txt c.txt d.txt
$ rm !*

Encore une fois, vous pouvez utiliser un argument spécifique de la commande précédente

par exemple. Cela crée 4 fichiers et supprimera le 3ème fichier (c.txt)

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

De même, vous pouvez utiliser une plage d'arguments de la dernière commande comme suit

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

Cela réutilisera les arguments 2 à 4 qui évaluent l'expression à rm b.txt c.txt d.txt

6
Teshan Shanuka J

Un de mes amis m'a envoyé ceci:

Cela fait partie de la bibliothèque GNU history. En bash, il est utilisé pour réexécuter des commandes dans votre historique. Si vous voulez être hardcore, grep pour history_expansion_char dans bash-4.1/lib/readline/histexpand .c pour les détails d'implémentation.

4
Vass