Vuelva a ejecutar el comando anterior bajo sudo

8

Quiero poder ejecutar un comando, falla porque no tiene los permisos adecuados. Entonces puedo escribir "por favor" para sudo el comando que acabo de ejecutar.

Esto es lo que quiero hacer en la terminal:

$ run command
"you don't have access to do that"
$ please
"ran successfully"

Vi que !!tomaría el comando anterior, así que pensé que podría usar eso, pero no puedo hacer que funcione.

mi script de shell please.sh se ve así, pero no puedo hacer que ninguno de estos funcione. Simplemente dice "¡comando no encontrado!" e imprime el uso de sudo.

#!/bin/zsh

#sudo !!
#sudo `!!`
sudo $(!!)
jb.
fuente
¿Funciona sin el guión? Si solo ejecutas, sudo !!¿funciona como se esperaba? Yo creo que !! puede ser un alias bash, por lo que puede no funcionar en zsh
Chris Wayne
3
AFAIK, la expansión de historial ( !!y otros) solo funciona en shells interactivos y no en scripts.
Thor
sudo !!en modo interactivo casi funciona como se esperaba. cuando presioné enter, lo reemplazaría !!con el comando anterior. luego tuve que presionar enter nuevamente para ejecutarlo.
jb.

Respuestas:

6

No se puede usar !!en un script de shell, ya que no se puede acceder al shell primario en un shell secundario. Aunque recomiendo usar sudo !!, si realmente quieres hacer un script BASH, deberías usar .bash_history, así:

#!/bin/bash
sudo `cat $HOME/.bash_history | tail -n1`

Definitivamente NO es una solución perfecta, pero debería funcionar. Si está utilizando ZSH, esto no funcionará, ya que ZSH no se envía a .bash_history (que yo sepa). ACTUALIZACIÓN : Aquí hay una versión que debería funcionar con ZSH:

#!/usr/bin/zsh
. $HOME/.zshrc
sudo `cat \`readlink -f $HISTFILE\` | tail -n1`

¡Espero que esto ayude!

Si no comprende el script, simplemente ejecuta el último comando ingresado en BASH con sudo.

MiJyn
fuente
Okay. Aunque estoy usando zsh. ¿hay algún equivalente para .bash_history en zsh?
jb.
Ahora que lo veo, sí, hay una versión que debería funcionar. Sin embargo, aún no lo he probado.
MiJyn
No lea el archivo de historial de bash directamente. Utilice los fco historyincorporados. Por defecto, $ HISTFILE no se actualiza hasta que cierre la sesión de bash.
Steven K
24

Agregue a su .zshrc:

alias please='sudo $(fc -ln -1)'
jpschorr
fuente
Funciona de maravilla, parece mejor que la respuesta aceptada anteriormente para facilitar su uso.
Mitchell Currie
2
Para los curiosos: fcsignifica comando de reparación. La documentación está aquí .
dshepherd
¡Gracias! Sé que esto es AskUbuntu, pero he usado esto en OSX para copiar mi última orden al portapapeles del sistema: alias lastcmd="fc -ln -1 | pbcopy"Creo que esto debería funcionar en Ubuntu (?): alias lastcmd="fc -ln -1 | xclip -selection clipboard.
HellaMad