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-foundscript que imprime mensajes.
Ubuntu 12.04
Mi primera aproximación a la fuente de cambio de esta secuencia de comandos para imprimir mensajes a stdoutsu 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_PROMPTse 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_PROMPTasí 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 stderra stdout. Para hacerlo, edite el archivo /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pyy cambie stderra stdouten 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 -yopción al apt-getcomando 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 impaquete se instalará.
/usr/lib/command-not-foundpero 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/cmdLos 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
evaly 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
echocomando 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