alias para um comando usando !! para recordar o último comando [duplicado]

1
    

Esta pergunta já tem uma resposta aqui:

    
  •              Como posso 'alias sudo !!'?                                      5 respostas                          
  •     

Esta é uma pergunta de acompanhamento para

Execute a line of commands with one sudo

Se você quiser refazer o mesmo comando com sudo !! 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 parâmetro -a .

Isto é o equivalente a sudo !! , mas ajuda-o a ultrapassar as restrições de sudo para o < e > Porque o sudo não permite que você use [& lt ;, >].

Como posso colocar isso em um alias no meu .bashrc para que eu possa usá-lo simples?

Eu tentei

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

Mas isso não funciona, eu recebo o erro:

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

$ redo
bash: /: Is a directory
tee: /: Is a directory
    
por rubo77 20.06.2014 / 16:51

2 respostas

1

Acho que o que você está procurando é:

sudo sh -c "!!"

Isso traduzirá !! para seu último comando e manterá os redirecionamentos de shell / pipes / variables 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"
    
por 20.06.2014 / 17:08
0

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

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

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

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

Isto executaria um comando como root sem você ter a chance de revisar o comando que está prestes a ser executado, o que me parece uma péssima idéia - especialmente considerando o fato de que, no momento em que você tem algo que funciona para todos os casos mais comuns provavelmente serão bastante complexos.

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

    
por 20.06.2014 / 17:05