Cosa fa “apt-get install !!” e come farlo funzionare?


54

Ho visto qualcuno scrivere

apt-get install !!

Lo ha fatto alcune volte e ogni volta è stato installato un programma diverso. Sembra che abbia automaticamente capito cosa è necessario dopo.

Tuttavia, quando l'ho provato sulla mia macchina virtuale Ubuntu 14.04.1 LTS, ha mostrato solo alcune istruzioni per l'uso. Cercare su Google apt-get install !!non sembra funzionare molto bene. Molti risultati della ricerca non contengono il doppio punto esclamativo.

Cosa fa apt-get install !!e cosa potrebbe mancare sulla mia macchina che non funzionava?


Risposte:


74

!! è una scorciatoia in bash che significa l'ultimo comando eseguito.

Prova questo:

 echo hello
 !!

In questo contesto, !!verrà espanso in un altro echo hello.

Immagino che cosa sia accaduto sia che abbiano tentato di eseguire un comando che non è riuscito e si siano lamentati che non era installato. Quindi hanno digitato sudo apt-get install !!perché il nome del pacchetto coincideva per coincidenza con il nome del comando che hanno tentato di eseguire. Il comando risultante tenterebbe di installare un pacchetto con lo stesso nome del comando che avevano appena tentato di eseguire.


10
Sì, probabilmente è quello. Se corro lynx, vedi che non è installato e quindi esegui apt-get install !!installa lince. Non ha funzionato per me, perché ho provato apt-get install !!come unico comando.
Thomas Weller,

4
Un altro uso comune è quando qualcosa avrebbe dovuto essere eseguito come sudo, ad esempio, apt-get installqualcosa.
MBraedley,

6
@AL: digiti per primo apt-get install some-program, e quando ti rendi conto di non avere privilegi, semplicemente sudo !!, che si espande a sudo apt-get install some-program.
Margarciaisaia,

3
!!è un alias per !-1, ovvero l'ultimo elemento nella storia di bash. !-2è il penultimo e così via.
Tim

41

!!non ha niente a che fare con apt-get. È una parola chiave della shell che verrà espansa al comando precedente. Questa espansione viene eseguita dalla shell prima che venga interpretato il comando corrente.

Da man bash:

!! Fare riferimento al comando precedente. Questo è un sinonimo di `! -1 '.

Ad esempio, se si esegue un comando:

echo "foo"

Quindi se corri:

sudo apt-get install !!

sarà ampliato a:

sudo apt-get install echo foo

Come puoi vedere, si espande in due pacchetti echoe l'altro è foo. Non esiste un pacchetto autonomo denominato fooe echo. Oltre alla shell integrata echoc'è un /bin/echoeseguibile che fa parte del pacchetto GNU-coreutils. Quindi, otterrai errori dicendo che non sono disponibili tali pacchetti.

D'altra parte l'altra persona potrebbe fare qualcosa del genere:

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

Come vedi cowsayè in fase di installazione.

Ti suggerirei di non farlo (a meno che tu non sia sicuro), essere espliciti non fa male.


2
Grande spiegazione per il !!. Sapevo cosa significasse, ma mi piace il modo in cui l'hai descritto.
Terrance

1
+1 per l'avvertimento di non provarlo a casa.
Shadur,

16

!!: Fare riferimento al comando precedente. Questo è un sinonimo di !-1(La fonte ).

Ad esempio, se eseguo:

./test

quindi ricorda che devo essere root, quindi posso semplicemente digitare:

sudo !!

è lo stesso che scrivere:

sudo ./test

È utile quando l'ultimo comando contiene molti caratteri.


1
Brillante! Non ho mai pensato al sudo !!comando; quello che faccio da anni è premere una volta il tasto Su, quindi spostare il cursore completamente a sinistra e aggiungere sudo.
IQAndreas,

1
@IQAndreas La tua strada ti dà l'opportunità di ricontrollare il comando, il che non è un male durante l'esecuzione sudo.
Matt Nordhoff,

1
Ho sempre letto "sudo !!" come "volevo dire sudo per amor di
culo

1
@Vixen: In quel caso, thefuck potrebbe anche essere qualcosa per te
Thomas Weller,

@IQAndreas che sposta il cursore completamente a sinistra sembra troppo noioso. Perché non solo Ctrl+Ao almeno Home?
Ruslan,

2

Alla domanda è già stata data una risposta, quindi non sarò ripetitivo. Tuttavia, vorrei sottolineare che ci sono numerose scorciatoie simili in varie shell che aiutano a ripetere / trovare / modificare i comandi. Alcuni di quelli che uso sono:

  1. !$seguito da ENTERdigiterà l'ultima parola dell'ultimo comando. Per esempio,

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

Questo ti farà atterrare /let/me/in

  1. Ctrl- Re quindi digitare alcune parole da un comando precedente. Ad esempio, se si digita vi /home/mycoolproject.she seguito in su con alcuni comandi casuali come ls, cd, pwd, ecc quindi semplicemente digitando Ctrl- Rseguito da cooltirerà su quel vicomando.

Cerca solo le scorciatoie da tastiera bash (o csh o altro) e sarà la cosa migliore che hai fatto oggi!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.