Respostas:
A maneira mais simples é executar:
sudo !!
Isso executará o último comando, mas como superusuário.
Fonte .
!!
por conta própria executa o comando anterior, conforme salvo em history
. Além disso, fazer !-1
, !-2
e assim por diante executa seu último comando, o segundo último comando e assim por diante. Handy!
!<command>
executará o último evento a partir ~/.bash_history
desse início com<command>
!
coisa idiota da cópia copiada tcsh
me ferrou mais vezes do que nunca foi útil. Aspas duplas não protegem da interpretação de !
. $ foo "!bar"
-> !bar: event not found
.
O que outras pessoas estão dizendo
resposta : você entra sudo !!
imediatamente depois para repetir o comando anterior com privilégios escalados.
edit: Imagem encontrada via reddit , e é uma paródia da história em quadrinhos xkcd original de Randall Munroe.
Você pode tentar a tecla de seta para cima para percorrer seus comandos antigos e reescrevê-los / alterá-los e adicionar o que está sudo
na frente deles. (o botão inicial acima das teclas de seta definirá a posição para o início.)
Não gosto da sudo !!
ideia, porque às vezes você adiciona outro comando no meio e não se lembra mais.
sudo !!
, o shell se expandirá !!
para que você possa ver qual comando está tentando executar. Portanto, pode ser irritante pressionar Ctrl-C e encontrar o comando certo, mas pelo menos não o levará de surpresa.
!!
sudo !!<TAB>
e ele é preenchido automaticamente !!
para mim. O Bash pode expandir o histórico com M-^
(para mim, alt + shift + 6), mas isso é menos fluente (você pode refazer isso). Também existe shopt -s histverify
, o que faz com que, quando você usa a expansão do histórico e pressiona enter, ele fornece outra linha de prompt com a expansão executada para permitir que você a veja / edite.
shopt -s histverify
não vai ajudar nem um pouco. A maioria das pessoas se acostuma a bater Enter
duas vezes. Nesse momento, ainda é tarde para verificar o que aconteceu.
Vou apenas adicionar uma alternativa: tão curta quanto digitar sudo !!
e mais flexível:
Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A (place cursor at beginning of line)
"sudo "
Enter
É exatamente o mesmo número de pressionamentos de tecla (conto "ctrl + A" como um ...), mas adicionando "seta para cima", você pode fazer isso conforme o comando que estiver no seu histórico.
set -o vi
). Então você pode Escapar (vá para o modo de comando) e, em seguida, 'I' (maiúscula 'i', insira no início da linha).
Há algumas maneiras de fazer isto
Basta digitar o comando novamente, adicionando sudo
antes do comando
Pressione Up arrowpara obter o último comando e colocar sudo
na frente dele.
Entrar sudo !!
O !!
expande para o último comando inserido. Você pode fazer coisas semelhantes com outras coisas com o histórico da linha de comando, veja aqui
Esta questão poderia ter sido generalizada em " Executar o mesmo comando, mas com algumas modificações ", uma vez que uma das brilhantes decisões de design no Unix é que o que é implementado uma vez no shell pode ser aproveitado por qualquer comando invocado no shell.
Em outras palavras, esse truque não se aplica apenas a sudo
:
sudo !!
)time !!
)env A=b B=z !!
)!!
)A expansão do histórico (também conhecida como substituição do histórico) é apenas um recurso do shell para facilitar a repetição de comandos anteriores (com menos pressionamentos de tecla). Verifique sua página de manual do shell para history expansion
. Ele descreve muitos outros truques e atalhos que você pode fazer com o histórico, por exemplo:
Você pode consultar os comandos anteriores por número:
!55 # repeat command number 55
!-1 # repeat the previous command, alias for !!
!-2 # repeat the command before the previous command
Você pode consultar palavras individuais em comandos anteriores:
some-command !$ # run some-command on the last arg of previous command
Você também pode pesquisar antes de repetir:
!?awk # repeat the last command including the string 'awk'
Você pode pesquisar o histórico e substituir algo por outro:
!?awk?:s/str1/str2/ # repeat previous command matching 'awk' replacing str1 by str2
E muito mais, já que você pode combinar a seleção de comandos, a seleção de argumentos, pesquisar e substituir independentemente.
A página de manual do seu shell (neste caso man bash
) é sua amiga.
Eu uso o zsh em vez do bash e tenho isso no meu ~/.zshrc
, então, pressionando Alt+ Sinsere sudo
no início da linha de comando:
insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo
Infelizmente, não consegui encontrar uma maneira de fazer a mesma coisa no bash.
Se você quiser fazer isso em um alias, precisará usar alias redo='sudo $(history -p !!)'
por algum motivo.
Do jeito que eu prefiro:
Mas pode ser mais fácil fazer "sudo !!", depende de você.