Que fait “apt-get install !!” et comment le faire fonctionner?

54

J'ai vu quelqu'un taper

apt-get install !!

Il l'a fait plusieurs fois et à chaque fois, un programme différent a été installé. Il semble qu'il ait automatiquement compris ce qu'il fallait faire ensuite.

Cependant, lorsque je l'ai essayée sur ma machine virtuelle Ubuntu 14.04.1 LTS, elle ne contenait que des instructions d'utilisation. Googler pour apt-get install !!ne semble pas très bien fonctionner. De nombreux résultats de recherche ne contiennent pas le double point d'exclamation.

Que fait apt-get install !!-il et que pourrait-il manquer sur ma machine pour qu’elle ne fonctionne pas?

Thomas Weller
la source
1
Voir aussi: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

Réponses:

74

!! est un raccourci dans bash qui signifie la dernière commande exécutée.

Essaye ça:

 echo hello
 !!

Dans ce contexte, le !!sera étendu à un autre echo hello.

J'imagine que ce qui s'est passé, c'est qu'ils ont essayé d'exécuter une commande et que cela a échoué et s'est plaint de ne pas l'avoir installé. Alors ils ont tapé sudo apt-get install !!parce que le nom du paquet était par coïncidence le même nom que le nom de la commande qu'ils ont essayé d'exécuter. La commande résultante tenterait d'installer un package du même nom que la commande qu'ils venaient d'exécuter.

Stephen
la source
10
Oui, c'est probablement ça. Si je lance lynx, voir qu'il n'est pas installé et ensuite l'exécuter apt-get install !!installe Lynx. Cela n'a pas fonctionné pour moi, car j'ai essayé en apt-get install !!tant que commande unique.
Thomas Weller
4
Une autre utilisation courante est quand quelque chose aurait dû être exécuté comme sudo, par exemple, apt-get installquelque chose.
MBraedley
6
@AL: vous tapez d’abord apt-get install some-program, et lorsque vous réalisez que vous n’avez pas de privilèges, vous vous contentez de le sudo !!développer sudo apt-get install some-program.
mgarciaisaia
3
!!est un alias pour !-1, c'est-à-dire le dernier élément de l'historique bash. !-2est l'avant-dernière et ainsi de suite.
Tim
41

!!n'a rien à voir avec apt-get. C'est un mot clé shell qui sera étendu à la commande précédente. Cette expansion est effectuée par shell avant que la commande en cours ne soit interprétée.

De man bash:

!! Reportez-vous à la commande précédente. Ceci est un synonyme de `! -1 '.

Par exemple, si vous exécutez une commande:

echo "foo"

Alors si vous courez:

sudo apt-get install !!

il sera étendu à:

sudo apt-get install echo foo

Comme vous pouvez le constater, il est étendu à deux packages echo, l’autre foo. Il n'y a pas de paquet autonome nommé fooet echo. En plus du shell intégré, echoil y a un /bin/echoexécutable qui fait partie du paquet GNU-coreutils. Donc, vous obtiendrez des erreurs en disant qu'aucun de ces paquets n'est disponible.

D'autre part, l'autre personne pourrait faire quelque chose comme ceci:

$ cowsay
The program 'cowsay' is currently not installed. You can install it by typing:
sudo apt-get install cowsay

$ sudo apt-get install !!
sudo apt-get install cowsay
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  filters
The following NEW packages will be installed:
  cowsay
0 upgraded, 1 newly installed, 0 to remove and 119 not upgraded.
Need to get 18.5 kB of archives.

Comme vous pouvez le voir cowsayest en cours d'installation.

Je vous suggère de ne pas le faire (sauf si vous en êtes certain), le fait d'être explicite ne nuit pas.

heemayl
la source
2
Grande explication pour le !!. Je savais ce que cela voulait dire, mais j'aime bien la façon dont vous l'avez décrit.
Terrance
1
+1 pour l'avertissement de ne pas essayer ceci à la maison.
Shadur
16

!!: Reportez-vous à la commande précédente. Ceci est un synonyme de !-1(La source ).

Par exemple, si j'exécute:

./test

puis rappelez-vous que je dois être Root, alors je pourrais simplement taper:

sudo !!

c'est la même chose que de taper:

sudo ./test

C'est utile lorsque votre dernière commande contient beaucoup de caractères.

Bilal
la source
1
Brillant! Je n'ai jamais pensé à la sudo !!commande; Ce que je fais depuis des années est d’appuyer une fois sur la touche haut, puis de déplacer le curseur tout à fait à gauche et d’ajouter sudo.
IQAndreas
1
@ IQAndreas Votre manière vous donne l'occasion de vérifier la commande, ce qui n'est pas une mauvaise chose lors de l'exécution sudo.
Matt Nordhoff
1
Je lis toujours "sudo !!" comme "je voulais dire sudo pour f *** sake"
Viktor Mellgren
1
@Vixen: Dans ce cas, thefuck pourrait aussi être quelque chose pour vous
Thomas Weller
@IQAndreas déplacer le curseur tout à fait à gauche semble trop ennuyeux. Pourquoi pas juste Ctrl+Aou du moins Home?
Ruslan
2

La question a déjà été répondue, je ne vais donc pas me répéter. Cependant, je tiens à souligner qu’il existe de nombreux raccourcis de ce type dans différents shells qui permettent de répéter / trouver / éditer des commandes. Certains de ceux que j'utilise sont:

  1. !$suivi de ENTERva taper le dernier mot de la dernière commande. Par exemple,

    ls -l /let/me/in
    cd !$

Cela vous atterrira dans /let/me/in

  1. Ctrl- Rpuis tapez quelques mots d'une commande précédente. Par exemple, si vous avez saisi vi /home/mycoolproject.shet suivi avec quelques commandes aléatoires comme ls, cd, pwd, etc. , puis juste en tapant Ctrl- Rsuivi coolva tirer vers le haut que vicommande.

Il suffit de chercher les raccourcis clavier bash (ou csh ou autre) et ce sera la meilleure chose que vous ayez faite aujourd'hui!

Hopping Bunny
la source