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? `



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 !!)"'

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.


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


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>.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.