Comment ça !! travailler à bash?

34

Très utile lorsque vous oubliez un sudo au début de votre commande, il !!agit comme un alias de la commande précédente. Exemple :

$ mv /very/long/path/for/a/protected/sensible/file/caution.h .
(...) Permission denined
$ sudo !!
sudo mv /very/long/path/for(...) .
[sudo] password :
  • Comment appelons-nous ce double !!tour? Les recherches sur Internet sont difficiles à cause de ce jeton.
  • Comment ça marche ? Je soupçonne un lien avec la commande history.
  • Où est-ce défini? Puis-je définir un autre moi-même?

EDIT: Quelques désignateurs d’événements intéressants

!!:*

Il fait référence aux arguments de la commande précédente. Cas d'utilisation :

cat /a/file/to/read/with/long/path
nano !!:*

:p

Imprimez simplement la commande sans l'exécuter, vous devez la mettre à la fin du désignateur d'événement.

$ !-5:p
sudo rm /etc/fstab -f

Plus ici .

Totem
la source
3
Lireman history
Costas
1
C'est un cas particulier de développement de l'historique, dans lequel le shell tente de développer un mot en commençant par !une commande correspondante dans la liste d'historique du shell actuel. !!est un cas spécial, équivalent à !-1, où un nombre négatif naprès !fait référence à la nième commande précédente.
Chepner
1
@Costas, plus utilement, lisez LESS='+/^HISTORY EXPANSION' man bash.
Wildcard

Réponses:

34

!!est répertorié dans le bashmanuel sous le titre "Event Designators":

   An event designator is a reference to a command line  entry  in  the
   history list.  Unless the reference is absolute, events are relative
   to the current position in the history list.

   !      Start a history  substitution,  except  when  followed  by  a
          blank,  newline,  carriage  return,  = or ( (when the extglob
          shell option is enabled using the shopt builtin).
   !n     Refer to command line n.
   !-n    Refer to the current command minus n.
   !!     Refer to the previous command.  This is a synonym for  `!-1'.
   !string
          Refer  to the most recent command preceding the current posi-
          tion in the history list starting with string.
   !?string[?]
          Refer to the most recent command preceding the current  posi-
          tion  in  the history list containing string.  The trailing ?
          may be omitted if string is followed immediately  by  a  new-
          line.
   ^string1^string2^
          Quick  substitution.   Repeat the previous command, replacing
          string1       with       string2.        Equivalent        to
          ``!!:s/string1/string2/'' (see Modifiers below).
   !#     The entire command line typed so far.

Donc, !!sera remplacé par la commande précédente.

Notez que l'historique du shell ne contiendra pas le littéral !!mais la commande réelle qui a été exécutée:

$ ls
[some output]

$ !! .
[same output]

$ history 3
  645  2016-08-25 17:40:55 ls
  646  2016-08-25 17:40:57 ls .
  647  2016-08-25 17:41:00 history 3
Kusalananda
la source