No puede simplemente quedarse sudo
delante de un comando de shell, debe invocar un shell para evaluar ese comando nuevamente (haciendo cosas como expandir variables, abrir archivos para operadores de redirección, etc.). Así que eso es
sudo bash -c !!
excepto que esto no funciona del todo, porque !!
interpola el texto del comando anterior, caracteres especiales y todo. Debe recuperar el texto del comando como una cadena y pasarlo como argumento a sh
. Afortunadamente, bash fc
incorporado de bash te permite hacer eso¹.
sudo bash -c "$(fc -ln -1)"
O incluso, para asegurarse de invocar la misma versión de bash que se está ejecutando actualmente:
sudo "$BASH" -c "$(fc -ln -1)"
Tenga en cuenta que, dado que el comando se ejecuta en un proceso de shell separado, hereda las variables de entorno (solo las que sudo
conserva, mind), pero no las variables internas de shell. Las opciones de Shell (por ejemplo kshglob
) y otras configuraciones comenzarán desde el valor predeterminado.
El mismo command² trabaja en zsh y ksh, aunque ATT ksh93 requiere tanto el first
y last
número que se pasa a fc
³ (que también funciona en bash, zsh y pdksh / mksh):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
El uso $0
para designar el ejecutable del shell en ejecución solo funciona si el shell se invocó a través de $ PATH y $ PATH no ha cambiado, o a través de una ruta absoluta.
Aquí hay otro método en zsh que es un poco más claro pero más largo:
sudo zsh -c $history[$[HISTCMD-1]]
Una última palabra de advertencia: sudo
es para comandos potencialmente peligrosos. ¡No lo hagas demasiado fácil de usar!
¹ Hay algunos espacios en blanco adicionales al principio y la sustitución de comandos elimina las nuevas líneas al final, pero la sintaxis del shell no se preocupa por eso.
² No creo que zsh o ksh tengan algo como bash $BASH
; $0
solo funciona cuando es una ruta absoluta, o cuando no contiene una barra inclinada y la ruta de búsqueda de comandos no ha cambiado.
³ es un alias para ATT ksh pero es igual de bueno. fc
hist