Acabei de aprender que o Linux tem um sudo !!
comando que se aplica literalmente sudo
ao último comando inserido. Eu nunca tinha ouvido falar sobre isso.
Isso é um controle comum? Onde posso encontrar documentação sobre isso?
Acabei de aprender que o Linux tem um sudo !!
comando que se aplica literalmente sudo
ao último comando inserido. Eu nunca tinha ouvido falar sobre isso.
Isso é um controle comum? Onde posso encontrar documentação sobre isso?
Respostas:
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
É 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 bash
página do manual, na Event Designators
seçã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.
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.