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?