alias para um comando usando !! para recuperar o último comando

alias para um comando usando !! para recuperar o último comando

Esta é uma pergunta complementar para

Execute uma linha de comandos com um sudo

Se você quiser refazer o mesmo comando comsudo !!depois de fazer um comando como este:

echo "something">/path/file

Você pode usar a sintaxe de substituição global para recuperar o comando:

!!:gs/>/|sudo tee -a /

Use um espaço após o-aparâmetro.

Isto é o equivalente asudo!!mas ajuda a ignorar as restrições do sudo para < e >. Porque o sudo não permite que você use [<, >].

Como posso colocar isso em um alias no meu .bashrcpara poder usá-lo de forma simples?

tentei

alias redo='!!:gs/>/|sudo tee -a /'

Mas isso não funciona, recebo o erro:

$ echo "sdfdsf">/path/file
bash: /path/file: no permissions

$ redo
bash: /: Is a directory
tee: /: Is a directory

Responder1

Acho que o que você está procurando é:

sudo sh -c "!!"

Isso será traduzido !!para o seu último comando e manterá os redirecionamentos/pipes/variáveis ​​do shell funcionais:

➜  ~  ping 10.0.0.1
--- 10.0.0.1 ping statistics ---
6 packets transmitted, 3 received, 50% packet loss, time 5001ms
rtt min/avg/max/mdev = 1.736/1.951/2.182/0.185 ms
➜  ~  sudo sh -c "!!" ## And becomes like this:
➜  ~  sudo sh -c "ping 10.0.0.1"

Responder2

Não é exatamente uma resposta à sua pergunta, mas: não faça isso.

A ideia por trás desse alias (assumindo que funcionou) é que transformar-se >em |tee -a fooé uma boa ideia. Em primeiro lugar, mesmo no melhor dos casos, não são equivalentes. >irá sobrescrever um arquivo, tee -aserá anexado.

Em segundo lugar, isso não lida com construções comuns como echo >>foo(que seria transformado echo |sudo tee -a |sudo tee -a fooe falharia) ou echo 2>&1(que seria transformado echo 2|sudo tee -a &1e falharia).

Agora, você pode escrever uma substituição muito mais complicada que possa lidar razoavelmente com todos esses casos, mas isso me leva ao terceiro ponto:

Isso executaria um comando como root sem que você tivesse a chance de revisar o comando que está prestes a ser executado, o que me parece uma idéia extremamente ruim - especialmente considerando o fato de que, no momento em que você tiver algo que funcione até mesmo para todos os nos casos mais comuns, provavelmente será bastante complexo.

Então, apesar de tudo, eu recomendo que você não tente nada desse tipo.

informação relacionada