Was macht "apt-get install !!" und wie funktioniert es?

54

Ich habe jemanden beim Tippen gesehen

apt-get install !!

Er tat dies einige Male und jedes Mal wurde ein anderes Programm installiert. Es scheint, als hätte es automatisch herausgefunden, was als nächstes benötigt wird.

Als ich es jedoch auf meiner virtuellen Ubuntu 14.04.1 LTS-Maschine ausprobierte, wurden nur einige Verwendungsanweisungen angezeigt. Googeln für apt-get install !!scheint nicht sehr gut zu funktionieren. Viele Suchergebnisse enthalten kein doppeltes Ausrufezeichen.

Was macht apt-get install !!und was könnte an meinem Rechner fehlen, dass es nicht funktioniert hat?

Thomas Weller
quelle
1
Siehe auch: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

Antworten:

74

!! ist eine Abkürzung in Bash, die bedeutet, dass der letzte Befehl ausgeführt wurde.

Versuche dies:

 echo hello
 !!

In diesem Zusammenhang !!wird das zu einem anderen erweitert echo hello.

Ich stelle mir vor, was passiert ist, als sie versucht haben, einen Befehl auszuführen, der fehlgeschlagen ist und sich darüber beschwert hat, dass er nicht installiert wurde. Dann tippten sie, sudo apt-get install !!weil der Paketname zufällig mit dem Namen des Befehls übereinstimmte, den sie auszuführen versuchten. Der resultierende Befehl würde versuchen, ein Paket mit demselben Namen wie der Befehl zu installieren, den sie gerade ausgeführt hatten.

Stephen
quelle
10
Ja, das ist es wahrscheinlich. Wenn ich laufe lynx, stelle ich sicher , dass es nicht installiert ist und apt-get install !!installiere dann lynx. Bei mir hat es nicht geklappt, weil ich es apt-get install !!als einziges Kommando versucht habe .
Thomas Weller
4
Eine andere gebräuchliche Verwendung ist, wenn etwas hätte ausgeführt werden sollen sudo, wie zum Beispiel apt-get installetwas zu tun.
MBraedley
6
@AL: Sie erste Typ apt-get install some-program, und wenn Sie feststellen , Sie haben keine Berechtigung, die Sie gerade sudo !!, die expandiert nach sudo apt-get install some-program.
Margarciaisaia
3
!!ist ein Alias ​​für !-1das letzte Element in der Bash-Geschichte. !-2ist das vorletzte und so weiter.
Tim
41

!!hat nichts damit zu tun apt-get. Es ist ein Shell-Schlüsselwort, das auf den vorherigen Befehl erweitert wird. Diese Erweiterung wird von der Shell durchgeführt, bevor der aktuelle Befehl interpretiert wird.

Von man bash:

!! Lesen Sie den vorherigen Befehl. Dies ist ein Synonym für! -1.

Wenn Sie beispielsweise einen Befehl ausführen:

echo "foo"

Wenn du dann rennst:

sudo apt-get install !!

es wird erweitert auf:

sudo apt-get install echo foo

Wie Sie sehen, ist es nämlich in zwei Pakete erweitert echound das andere ist foo. Es gibt kein eigenständiges Paket namens foound echo. Abgesehen von der eingebauten Shell echogibt es eine /bin/echoausführbare Datei, die Teil des GNU-Coreutils-Pakets ist. Sie erhalten also die Fehlermeldung, dass keine solchen Pakete verfügbar sind.

Auf der anderen Seite könnte die andere Person so etwas tun:

$ 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.

Wie Sie sehen, cowsaywird gerade installiert.

Ich würde Ihnen empfehlen, dies nicht zu tun (es sei denn, Sie sind sich sicher), explizit zu sein, schadet nicht.

heemayl
quelle
2
Tolle Erklärung für die !!. Ich wusste, was es bedeutete, aber ich mag die Art, wie Sie es beschrieben haben.
Terrance
1
+1 für die Warnung, dies nicht zu Hause zu versuchen.
Shadur
16

!!: Siehe vorherigen Befehl. Dies ist ein Synonym für !-1(Die Quelle ).

Zum Beispiel, wenn ich ausführe:

./test

Dann denke daran, dass ich Root sein muss, dann könnte ich einfach Folgendes eingeben:

sudo !!

es ist dasselbe wie das Tippen:

sudo ./test

Dies ist nützlich, wenn Ihr letzter Befehl viele Zeichen enthält.

Bilal
quelle
1
Brillant! Ich habe nie über den sudo !!Befehl nachgedacht . Was ich seit Jahren mache, ist, einmal die Aufwärts-Taste zu drücken, dann den Cursor ganz nach links zu bewegen und hinzuzufügen sudo.
IQAndreas
1
@IQAndreas Ihr Weg gibt Ihnen die Möglichkeit, den Befehl zu überprüfen, was beim Ausführen keine schlechte Sache ist sudo.
Matt Nordhoff
1
Ich lese immer "sudo !!" als "ich meinte sudo um Himmels willen"
Viktor Mellgren
1
@Vixen: In diesem Fall könnte der Fick auch etwas für dich sein
Thomas Weller
@IQAndreas Bewegen des Cursors ganz nach links scheint zu langweilig. Warum nicht einfach Ctrl+Aoder zumindest Home?
Ruslan
2

Die Frage wurde bereits beantwortet, daher werde ich mich nicht wiederholen. Ich möchte jedoch darauf hinweisen, dass es in verschiedenen Shells zahlreiche solcher Verknüpfungen gibt, die das Wiederholen / Finden / Bearbeiten von Befehlen erleichtern. Einige von denen, die ich benutze, sind:

  1. !$gefolgt von ENTERwird das letzte Wort des letzten Befehls eingeben. Zum Beispiel,

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

Dies wird Sie in landen /let/me/in

  1. Ctrl- Rund geben Sie dann ein paar Wörter aus einem vorherigen Befehl ein. Zum Beispiel, wenn Sie eingegeben vi /home/mycoolproject.shund anschließend mit einigen zufälligen Befehlen auf wie ls, cd, pwdusw. dann nur die Eingabe Ctrl- Rgefolgt von coolwird , dass die Pull - up - viBefehl.

Suchen Sie einfach nach bash (oder csh oder was auch immer) Tastaturkürzeln und es wird das Beste sein, was Sie heute getan haben!

Hopfender Hase
quelle