Lorsque vous tapez une commande qui n'existe pas dans votre système, bash s'exécute une fonction command_not_found_handle()
. Dans cette fonction, il existe un appel à un /usr/lib/command-not-found
script qui imprime des messages.
Ubuntu 12.04
Ma première supposition pour changer la source de ce script pour imprimer des messages à la stdout
place stderr
, mais quand je lisais la source du script, j'ai trouvé que vous pouvez le configurer pour simplement vous demander si vous souhaitez installer le paquet manquant.
Si vous exportez une variable, il COMMAND_NOT_FOUND_INSTALL_PROMPT
vous sera demandé d'installer le package manquant:
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:
Versions antérieures d'Ubuntu
Malheureusement, il n'y en a pas COMMAND_NOT_FOUND_INSTALL_PROMPT
, je peux donc trouver quelques autres options:
1) Installez le package à partir de 12.04 - cela ne devrait pas être le problème - ce ne sont que quelques scripts en Python donc cela devrait fonctionner (non testé!).
2) Passez stderr
à stdout
. Pour ce faire, modifiez le fichier /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
et passez stderr
aux stdout
lignes 237 et 240.
Après cela, vous pouvez l'utiliser de cette façon:
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 vous ajoutez une -y
option à la apt-get
commande aux lignes 237 et 240, vous pouvez également utiliser la syntaxe !! | sh
.
3) Vous pouvez également modifier ce script à partir de la ligne 242 de cette manière:
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 cette façon, vous obtiendrez votre commande dans un fichier ~/.install-missing
, vous pouvez donc créer un alias:
alias im="chmod +x ~/.install-missing; ~/.install-missing"
Si vous appelez le im
package sera installé.
/usr/lib/command-not-found
mais n'a aucune référence àCOMMAND_NOT_FOUND_INSTALL_PROMPT
- des pensées?