alias para un comando usando !! para recuperar el último comando

alias para un comando usando !! para recuperar el último comando

Esta es una pregunta de seguimiento para

Ejecutar una línea de comandos con un sudo

Si desea rehacer el mismo comando consudo !!después de hacer un comando como este:

echo "something">/path/file

Puede utilizar la sintaxis de reemplazo global para recuperar el comando:

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

Utilice un espacio después del-aparámetro.

Este es el equivalente asudo!!pero le ayuda a evitar las restricciones de sudo para < y >. Porque sudo no te permite usar [<, >].

¿Cómo puedo poner esto en un alias en mi .bashrcpara poder usarlo de manera simple?

Lo intenté

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

Pero esto no funciona, me sale el error:

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

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

Respuesta1

Creo que lo que buscas es:

sudo sh -c "!!"

Esto se traducirá !!a su último comando y mantendrá funcionales las redirecciones/canalizaciones/variables del shell:

➜  ~  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"

Respuesta2

No es exactamente una respuesta a tu pregunta, pero: no hagas esto.

La idea detrás de este alias (suponiendo que funcione) es que transformarse >en |tee -a fooes una buena idea. En primer lugar, incluso en el mejor de los casos, no son equivalentes. >sobrescribirá un archivo, tee -alo agregará.

En segundo lugar, esto no maneja construcciones comunes como echo >>foo(que se transformaría echo |sudo tee -a |sudo tee -a fooy fallaría) o echo 2>&1(que se transformaría echo 2|sudo tee -a &1y fallaría).

Ahora, es posible que puedas escribir una sustitución mucho más complicada que pueda manejar todos estos casos de manera razonable, pero eso me lleva al tercer punto:

Esto ejecutaría un comando como root sin que usted tenga la oportunidad de revisar el comando que está a punto de ejecutarse, lo que me parece una idea extremadamente mala, especialmente teniendo en cuenta el hecho de que, para cuando tenga algo que funcione incluso para todos los En los casos más comunes, probablemente será bastante complejo.

Así que, en definitiva, te recomiendo que no intentes nada de este tipo.

información relacionada