Como posso `alias sudo !!`?

50

Estou tentando definir um alias para o sudo !!Bash. Eu tentei alias sbb='sudo !!', mas interpreta isso como literal !!e imprime

sudo: !!: command not found

Se eu usar aspas duplas, ele substituirá o estrondo duplo na própria string, para que não funcione.

Existe alguma maneira de fazer isto funcionar? Ou um alias alternativo? `

Manishearth
fonte
Veja também Executar uma linha de comandos com um sudo
Gilles 'SO- stop be evil'
Possível mesmo no SU: superuser.com/questions/240180/…
Ciro Santilli escreveu:

Respostas:

61

!!é expandido pelo bash quando você digita. Não é expandido por substituição de alias.

Você pode usar o historybuilt-in para fazer a expansão:

alias sbb='sudo $(history -p !!)'

Se o comando for mais do que um comando simples (por exemplo, ele contém redirecionamentos ou pipes), você precisa chamar um shell no sudo:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'
rici
fonte
Tem um para o tcsh?
Mdpc
11
@mdpc: Eu não uso o tcsh, mas observei man tcshe descobri que ele faz a expansão do histórico durante a expansão do alias "como se o comando original fosse a linha de entrada anterior". Interessante. No entanto, alias sbb 'sudo \!-2não funcionou como esperado (na verdade, substituiu a segunda entrada anterior); alias sbb 'sudo \!\!'fez trabalho conforme o esperado (substituído sbbpara !!); e, no final, descobriu-se que o que eu queria era o alias sbb 'sudo \!-1'que eu esperava que fosse o mesmo \!\!. (tcsh 6.17.06 (Astron) 15-04-2011) YMMV. Boa sorte.
rici 02/08
Obrigado! Esse alias é ótimo quando, como administrador, você esquece de colocar o sudo na frente do seu comando.
Mdpc
em vez de sbbeu preferiria preasecomo alias como sugerido por @jpschorr
rubo77
40

Experimentar:

alias sbb='sudo $(fc -ln -1)'

Na verdade, eu prefiro chamá-lo de 'por favor':

alias please='sudo $(fc -ln -1)'

Info: fcé um comando embutido no shell bash. que lista, edita e reexecuta comandos inseridos anteriormente em um shell interativo.

jpschorr
fonte
13
pleaseé definitivamente o caminho a percorrer!
Anto
funciona para o bash também, então removemos o comentário 'for zsh'.
quer
11
Funciona bem no zsh. fc é o comando a ser usado. Obrigado
Frax
pleasefaz parecer que o terminal é uma entidade que eu tenho que ser legal para fazer as coisas. Eu prefiro algo que dá uma melhor sensação de controle - como fuck;)
Przemek D
5

Agora, há um repositório para essa finalidade no GitHub, que verifica magicamente se precisa de direitos de superusuário, também corrige os erros de digitação:

https://github.com/nvbn/thefuck

Arda
fonte
Eu tentei o apt-get install thefuckque existe, mas ele não funciona no meu Ubuntu 15.10; (
rubo77 15/06
0

Isso foi publicado originalmente nesta pergunta, mas posteriormente sugerido para publicação aqui.

Aqui está como você pode usar fce historycom o alias para !-substituições semelhantes. Suponha que, se você deseja usar !-n(em que n é o dígito do enésimo último comando usado), use fce historycom o alias da seguinte maneira:

  1. Usando history:

    alias xyz='echo $(history -p "!-<n>") ; sudo $(history -p "!-n")'

    Nota: Aqui !-ndeve ser incluído com 'ou ''.

  2. Usando fc:

    alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)'

    Nota: aqui o e o -n são usados ​​para especificar o intervalo da lista de histórico.

Aqui eu usei eco antes de executar o comando para derrubar como !-<n>.

Pandya
fonte
As respostas anteriores já cobrem history -pe fc. Alguma novidade aqui?
Muru
Ok, e daí?
Muru
Acho -ln -n -nque isso é intensamente confuso; também o pouco sobre 'ou ''(e também o pouco sobre -<n>).
Scott
Opção 2. deve ser um erro de digitação, eu acho que você quer$(fc -ln -1)
cmcginty
-1
alias please="sudo $(history -p \!\-2)"
Antonin GAVREL
fonte