Onde posso encontrar documentação sobre o comando “sudo !!”

20

Acabei de aprender que o Linux tem um comando sudo !! que literalmente aplica sudo ao último comando digitado. Eu nunca tinha ouvido falar sobre isso.

Isso é um controle comum? Onde posso encontrar documentação sobre isso?

    
por Pier-Alexandre Bouchard 08.05.2012 / 20:54

3 respostas

36

Isso é apenas atalhos do bash. Não é sudo!! , a propósito. É sudo !! (observe o espaço).

O !! no bash é basicamente uma expansão do comando anterior.

Dê uma olhada na seção "Expansão do Histórico" da página man do bash:

link

    
por 08.05.2012 / 21:06
29

Na verdade, é sudo !! , que consiste no comando sudo , com o qual você provavelmente está familiarizado, e um designador de evento , !! , que se refere ao último comando inserido. Você pode encontrar mais na página bash man, na seção Event Designators .

Event Designators
   An event designator is a reference to a command line entry in the  his‐
   tory  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.
   !!     Refer to the previous command.  This is a synonym for '!-1'.
   !string
          Refer to the most recent command preceding the current  position
          in the history list starting with string.
   !?string[?]
          Refer to the most recent command preceding the current postition
          in the history list containing string.  The trailing  ?  may  be
          omitted if string is followed immediately by a newline.
   ^string1^string2^
          Quick  substitution.   Repeat  the  previous  command, replacing
          string1 with string2.  Equivalent  to  ''!!:s/string1/string2/''
          (see Modifiers below).
   !#     The entire command line typed so far.
    
por 08.05.2012 / 21:09
3

Esta separação de funcionalidade é um dos mais belos princípios de design, tornando o Linux / Unix muito mais poderoso do que outras alternativas, onde cada programa é uma ilha separada de convenções e capacidades.

"faça cada programa fazer uma coisa e faça bem"

Em vez de implementar !! dentro do sudo (ou qualquer outro comando) que pode se beneficiar da repetição do comando anterior - ele é implementado uma vez (nos shells) e todos os comandos podem se beneficiar dele. Então você pode fazer:

$ echo !!     # will echo the last command
$ time !!     # will repeat and time the last command
$ strace !!   # will repeat the last program while system-call tracing it

e assim por diante.

Mas isso não termina aqui. O shell faz muito mais do que expandir a história através do! designadores de eventos. Antes de executar seu comando, ele faz expansão de variável, expansão de caractere curinga de nome de arquivo (globbing), substituição de comando, redirecionamento de arquivo / E / S e muito mais. Todos os quais podem ser aproveitados e usados em qualquer comando que esteja sendo chamado a partir do shell.

Outra grande vantagem é que se você passar algum tempo aprendendo o seu shell ('man bash' neste caso) você precisa aprender uma vez e usar esses recursos poderosos em todos os lugares, o tempo todo. É muito mais fácil aprender um conjunto de princípios e convenções poderosos, em vez de reaprender como os comandos de linha de comando são tratados em cada programa ou utilitário.

    
por 14.05.2012 / 23:07

Tags