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?Vous étiez sur la bonne voie avec:
... mais il vous manque une option pour sh . Considérer:
Et puisque vous avez probablement besoin d'un accès root pour exécuter apt-get, considérez:
la source
Vous pouvez faire quelque chose comme ça:
!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd
Les programmes interactifs ne semblent pas bien fonctionner avec la tuyauterie car elle attend une entrée, «Y» dans ce cas, mais le descripteur de fichier stdin est fermé dès que la première commande est terminée.
la source
Vous pouvez utiliser une variable
eval
et une substitution de commandes, je crois (bien que je ne sois pas sûr de la sécurité de tout cela):Je suis prêt à être prouvé faux avec ce qui précède. Je teste cela sur une machine Red Hat avec une
echo
commande plutôt que ce que l'auto-complétion bash suggère, mais le principe devrait être le même.À la fin de la journée, il serait plus rapide de simplement taper aptitude install git ...
la source