O que o “apt-get install !!” faz e como fazê-lo funcionar?

54

Eu vi alguém digitando

apt-get install !!

Ele fez isso algumas vezes e sempre, um programa diferente foi instalado. Parece que ele descobriu automaticamente o que é necessário a seguir.

No entanto, quando tentei na minha máquina virtual Ubuntu 14.04.1 LTS, ele apenas mostrou algumas instruções de uso. Pesquisar no Google apt-get install !!parece não funcionar muito bem. Muitos resultados da pesquisa não contêm o ponto de exclamação duplo.

O que apt-get install !!faz e o que pode estar faltando na minha máquina que não funcionou?

Thomas Weller
fonte
11
Veja também: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

Respostas:

74

!! é um atalho no bash que significa o último comando executado.

Tente o seguinte:

 echo hello
 !!

Nesse contexto, o !!será expandido para outro echo hello.

Eu imagino o que aconteceu foi que eles tentaram executar um comando e ele falhou e reclamou que não estava instalado. Então, eles digitaram sudo apt-get install !!porque o nome do pacote coincidentemente era o mesmo que o nome do comando que eles tentaram executar. O comando resultante tentaria instalar um pacote com o mesmo nome que o comando que eles acabaram de tentar executar.

Stephen
fonte
10
Sim, provavelmente é isso. Se eu executar lynx, veja se não está instalado e, em seguida, execute apt-get install !!-o instala o lynx. Não funcionou para mim, porque tentei apt-get install !!como o único comando.
Thomas Weller
4
Outro uso comum é quando algo deveria ter sido executado sudo, como apt-get installalgo.
MBRedley
6
@AL: você digita primeiro apt-get install some-programe, quando percebe que não tem privilégios, apenas o sudo !!que se expande sudo apt-get install some-program.
Mgarciaisaia
3
!!é um alias para !-1, significando o último item no histórico do bash. !-2é o penúltimo e assim por diante.
Tim
41

!!não tem nada a ver com apt-get. É uma palavra-chave do shell que será expandida para o comando anterior. Essa expansão é feita pelo shell antes que o comando atual seja interpretado.

De man bash:

!! Consulte o comando anterior. Este é um sinônimo para `! -1 '.

Por exemplo, se você executar um comando:

echo "foo"

Então, se você executar:

sudo apt-get install !!

será expandido para:

sudo apt-get install echo foo

Como você pode ver, ele é expandido em dois pacotes, a saber, echoe o outro foo. Não existe um pacote independente chamado fooe echo. Além do shell embutido, echoexiste um /bin/echoexecutável que faz parte do pacote GNU-coreutils. Portanto, você receberá erros dizendo que nenhum desses pacotes está disponível.

Por outro lado, a outra pessoa pode estar fazendo algo assim:

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

Como você pode ver cowsayestá sendo instalado.

Eu sugiro que você não faça isso (a menos que tenha certeza), ser explícito não prejudica.

heemail
fonte
2
Ótima explicação para o !!. Eu sabia o que isso significava, mas eu gosto do jeito que você o descreveu.
Terrance
11
+1 no aviso para não tentar isso em casa.
Shadur 28/05
16

!!: Consulte o comando anterior. Este é um sinônimo para !-1(A fonte ).

Por exemplo, se eu executar:

./test

lembre-se de que eu preciso ser Root, então eu poderia simplesmente digitar:

sudo !!

é o mesmo que digitar:

sudo ./test

É útil quando o seu último comando contém muitos caracteres.

Bilal
fonte
11
Brilhante! Eu nunca pensei sobre o sudo !!comando; o que venho fazendo há anos é pressionar a tecla para cima uma vez, depois mover o cursor para a esquerda e adicionar sudo.
IQAndreas 25/05
11
@IQAndreas O seu caminho dá a você a oportunidade de verificar novamente o comando, o que não é algo ruim ao executar sudo.
Matt Nordhoff
11
Eu sempre leio "sudo !!" como "eu quis dizer sudo por amor de Deus"
Viktor Mellgren
11
@Vixen: Nesse caso, thefuck também poderia ser algo para você #
Thomas Weller
@IQAndreas mover o cursor para a esquerda parece muito chato. Por que não apenas Ctrl+Aou pelo menos Home?
Ruslan #
2

A pergunta já foi respondida, então não serei repetitivo. No entanto, gostaria de salientar que existem inúmeros atalhos em vários shells que ajudam a repetir / localizar / editar comandos. Alguns dos que eu uso são:

  1. !$seguido por ENTERdigitará a última palavra do último comando. Por exemplo,

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

Isso o levará a /let/me/in

  1. Ctrl- Re digite algumas palavras de um comando anterior. Por exemplo, se você digitou vi /home/mycoolproject.she seguiu-o com alguns comandos aleatórios como ls, cd, pwd, etc., em seguida, apenas digitando Ctrl- Rseguido por coolvai puxar para cima que vicomando.

Basta procurar por atalhos de teclado bash (ou csh ou o que seja) e será a melhor coisa que você fez hoje!

Hopping Bunny
fonte