Onde posso encontrar documentação sobre o comando "sudo !!"

20

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

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

Pier-Alexandre Bouchard
fonte
4
Você pode conferir commandlinefu.com/commands/browse/sort-by-votes . Alguns atalhos muito legais lá.
Leo
2
Veja também esta resposta
Michael Mrozek

Respostas:

36

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

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

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

http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators

cjc
fonte
Eu editei meu post anterior, esqueci o espaço como você disse!
Pier-Alexandre Bouchard
Ah, nunca vi esse atalho em lugar nenhum!
Pier-Alexandre Bouchard
29

É verdade sudo !!, que consiste no comando sudo, com o qual você provavelmente está familiarizado, e um designador evento , !!que corresponde ao último comando inserido. Você pode encontrar mais na bashpágina do manual, na Event Designatorsseção

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.
Kevin
fonte
3

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

"faça com que cada programa faça uma coisa e faça bem"

Em vez de implementar !! dentro do sudo (ou qualquer outro comando) que possa 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 via! designadores de eventos. Antes de executar seu comando, ele faz expansão variável, expansão de curinga de nome de arquivo (globbing), substituição de comando, redirecionamento de arquivo / E / S e muito mais. Tudo isso pode ser aproveitado e usado em qualquer comando que está sendo chamado a partir do shell.

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

arielf
fonte