Esta é uma pergunta complementar para
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 .bashrc
para 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 -a
será 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 foo
e falharia) ou echo 2>&1
(que seria transformado echo 2|sudo tee -a &1
e 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.