Remplacement du terminal! suivi d'un numéro avec une commande

12

Je suis très confus à propos de ma session de terminal ubuntu, il semble remplacer les sections des commandes qui commencent par !suivies d'un nombre avec des commandes apparemment aléatoires. Il le fait en le !87remplaçant par screen -let également par !88et en le remplaçant par ls.

Toute idée de la raison pour laquelle cela se produit serait très appréciée.

usbpc102
la source

Réponses:

20

C'est l' bashexpansion de l'histoire, par exemple

!87

réexécute la commande à partir de la ligne d'historique 87.

Vous trouverez la description de cette fonctionnalité dans la man bashsection «EXPANSION DE L'HISTORIQUE»:

       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.

Donc, pour appeler rapidement la dernière commande, faites !-1et pour l'avant-dernière commande !-5. Un synonyme pratique pour !-1est !!- si vous avez appelé par exemple apt install somethinget oublié le sudo, exécutez simplement sudo !!et vous êtes bon.

Seule la barre oblique inverse ( \ ) et les guillemets simples peuvent citer le caractère d'expansion de l'historique.

Pour éviter l'expansion de l'historique, vous devez soit échapper le point d'exclamation avec une barre oblique inverse ( \!) ou utiliser des guillemets simples ( '!').

dessert
la source
3
pour passer un littéral !à vos commandes et éviter l'expansion de l'historique, vous devrez les citer entre guillemets ou les échapper: foo '!87'ou foo \!87. (les guillemets doubles effectueront également l'expansion de leur contenu.)
Quizotic