Cuando escribe un comando que no existe en su sistema, bash ejecuta la función command_not_found_handle()
. En esta función hay una llamada al /usr/lib/command-not-found
script que imprime mensajes.
Ubuntu 12.04
Mi primera aproximación a la fuente de cambio de esta secuencia de comandos para imprimir mensajes a stdout
su lugar stderr
, pero cuando estaba leyendo fuente de escritura que encontró que puedes configurarlo para que sólo pregunte si desea instalar el paquete faltante.
Si exporta la variable, COMMAND_NOT_FOUND_INSTALL_PROMPT
se le pedirá que instale el paquete que falta:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm:
Versiones anteriores de Ubuntu
Desafortunadamente no hay, COMMAND_NOT_FOUND_INSTALL_PROMPT
así que puedo encontrar algunas otras opciones:
1) Instale el paquete desde 12.04, no debería ser el problema, solo son unos pocos scripts en Python, por lo que debería funcionar (¡no probado!).
2) Cambiar stderr
a stdout
. Para hacerlo, edite el archivo /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
y cambie stderr
a stdout
en las líneas 237 y 240.
Después de eso, puede usarlo de esta manera:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins
Si agrega la -y
opción al apt-get
comando en las líneas 237 y 240, también podría usar la sintaxis !! | sh
.
3) También puede modificar este script desde la línea 242 de esta manera:
print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()
De esta manera, obtendrá su comando en el archivo ~/.install-missing
, por lo que puede crear un alias:
alias im="chmod +x ~/.install-missing; ~/.install-missing"
Si llama im
paquete se instalará.
/usr/lib/command-not-found
pero no tiene ninguna referencia aCOMMAND_NOT_FOUND_INSTALL_PROMPT
... ¿pensamientos?Estabas en el camino correcto con:
... pero te falta una opción para sh . Considerar:
Y dado que probablemente necesite acceso de root para ejecutar apt-get, considere:
fuente
Puedes hacer algo como esto:
!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd
Los programas interactivos no parecen funcionar bien con la tubería porque espera una entrada, 'Y' en este caso, pero el descriptor de archivo stdin se cierra tan pronto como se completa el primer comando.
fuente
Puede usar una variable
eval
y la sustitución de comandos, creo (aunque no estoy seguro de qué tan seguro sería todo esto):Estoy dispuesto a demostrar que estoy equivocado con lo anterior. Estoy probando esto en una máquina Red Hat con un
echo
comando en lugar de la sugerencia automática de finalización de bash, pero el principio debería ser el mismo.Al final del día, sería más rápido escribir aptitude install git ...
fuente