j'ai utilisé
history | less
pour obtenir les lignes des commandes précédentes et des chiffres sur le côté gauche, j'ai trouvé la ligne que je voulais répéter (p. ex. 22) et
!22
à l'invite de commande et cela a fonctionné - en exécutant le jeu de commandes sur la ligne que je faisais à ce moment-là. Je ne peux pas comprendre où le point d'exclamation est utilisé, que représente-t-il en termes d'actions effectuées par bash et où l'utiliser. D'après la documentation, je ne vois pas d'explication «tangible».
Réponses:
!
est une fonctionnalité apparue à l'origine dans le shell C , à l'époque où vous pouviez compter sur les terminaux pour disposer de touches de direction. Cela est particulièrement utile si vous ajoutez le numéro de commande actuel à l'invite (PS1="\!$ "
) afin de pouvoir regarder rapidement 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-Rrechercher dans l'historique des commandes, je ne vois pas beaucoup d'utilisation de la fonctionnalité.
Une variante de ce que vous pourriez toujours trouver utile est celle
!!
qui ré-exécute la commande précédente. En soi, je ne trouve !!Enterpas plus rapide que juste ↑ Enter, mais cela peut être utile lorsqu'il est combiné à une commande plus grande.Exemple: une erreur de pilote commune sur les
sudo
systèmes de base consiste à oublier lesudo
préfixe d'une commande nécessitant des privilèges supplémentaires. Un novice retape toute la commande. L'élève diligent édite la commande à partir de l'historique des commandes du shell. Celui éclairé tapesudo !!
.Bash vous permet de désactiver le
!
traitement dans le shell avecset +o histexpand
ouset +H
. Vous pouvez le désactiver dans Zsh avecset -K
.la source
sudo
, ou quelque chose), alors vous pouvez le fairesudo !!
, par exemple. Cela pourrait être un peu plus rapide que "Up / Ctrl-A (ou Home, si vous êtes assez chanceux) / sudo / space / enter". YMMV. :)echo 'Hi!'
ouecho "Hi!"
ouecho Hi\!
. Tous font la même chose.setopt NO_BANG_HIST
dans zsh pourrait être plus mémorable que-K
.enlightened ones
:) ne peux pas croire que j'ai seulement été un étudiant assidu pendant tout ce temps ...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 de bash, vous trouverez une énorme section intitulée HISTORY EXPANSION sur le sujet.
Vous pouvez faire un hôte entier plus que simplement exécuter la dernière commande, ou le numéro X. Vous pouvez faire des choses comme
!cat
exécuter la dernière commande qui a commencé aveccat
. Ou!?bash?:s/bash/csh/
exécute la dernière commande contenantbash
mais la remplace parcsh
.la source
!!:s/bash/csh/
exécute la dernière commande , puis remplace bash par csh, le cas échéant. Pas la dernière commande qui incluait bash. Ce serait!?bash?:s/bash/csh/
ou peut!?bash?:s/%/csh/
man
pages, cette fonctionnalité est incroyablement obscure. Merci de signaler la section pertinente - c’est le seul endroit de la documentation où l’on explique suffisamment la situation.Beaucoup plus peut être fait avec
!
tels que:!-3
!ls
et beaucoup plus. Voir 15 exemples d'expansion de l'historique Linux Bash à connaître
la source
Un de mes amis m'a envoyé ceci:
la source
Bien sûr, vous pouvez faire
!!
pour réutiliser la dernière commande dans le shell bash. Et puis, il faut!$
réutiliser la dernière partie de votre dernière commande.par exemple voir un fichier
Si vous voulez maintenant éditer le même fichier, vous pouvez utiliser
!$
pour obtenir uniquement le chemin du fichier depuis la dernière commandela source
$touch f1 f2
et puis$vim !$
évaluera à$vim f2