Demandez à installer le programme après "Le programme 'x' n'est pas installé actuellement"

18

Si vous essayez d'exécuter un programme qui n'est pas installé, vous obtiendrez un message

The program 'x' is currently not installed. You can install it by typing: 
sudo apt-get install x

et au lieu de vous proposer d'installer le programme pour vous, vous devez taper la commande réelle. Comment changer ce comportement?

Gerhard Burger
la source

Réponses:

17

Le package responsable de ce comportement est le package de commande introuvableInstaller la commande introuvable et il inclut déjà le comportement souhaité bien qu'il soit désactivé par défaut. Vous pouvez l'activer en ajoutant la ligne suivante à votre~/.bashrc

export COMMAND_NOT_FOUND_INSTALL_PROMPT=1

Maintenant, le comportement est changé en

The program 'x' is currently not installed. You can install it by typing:
sudo apt-get install x
Do you want to install it? (N/y)

Remarque: Si vous recevez un message concernant le plantage de python (spécifiquement AttributeError: 'str' object has no attribute 'decode'), il s'agit du bogue 1073919 . Un correctif est déjà disponible pour Raring et Saucy. Alternativement ( utilisateurs avancés uniquement ), vous pouvez modifier le fichier /usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py, voir le diff attaché au rapport de bogue pour les lignes qui doivent être modifiées.

Edit: Le correctif est maintenant publié dans la version 0.3ubuntu7.1 dans Raring (SRU) et pour 0.3ubuntu8 dans Saucy.

Gerhard Burger
la source
1

Ma solution est un hybride entre sécurité et confort:

auto-apt vérifie l'accès aux fichiers des programmes s'exécutant dans ses environnements, et si un programme essaie d'accéder à un fichier dont l'appartenance à un package est désinstallé, auto-apt installera ce package à l'aide d'apt-get. Cette fonctionnalité nécessite qu'apt et sudo fonctionnent. Il fournit également une base de données simple pour rechercher quel package contient un fichier demandé.

C'est un émulateur de terminal où vous entrez dans un environnement où chaque accès aux fichiers est préalablement vérifié par auto-apt et s'il n'existe pas, recherchez dans la base de données (à la apt-file) et téléchargez et installez le package souhaité, puis autorisez le programme à continuer . Vous devez l'exécuter en tant que root:

sudo auto-apt

Ceci est utile dans les cas où vous créez un package et n'est pas d'humeur à être devant l'écran à la recherche de chaque erreur de configuration pour les en-têtes manquants, etc.

Cela peut également être utilisé comme remplacement apt-get + apt-file où vous pouvez installer des programmes en disant simplement à l' commandexécuter.

Vous devez comprendre que vous ne devez pas le laisser ouvert lorsque votre système n'est pas regardé, car c'est presque comme si vous utilisiez l'utilisateur root.

Page de manuel: http://derpi.tuwien.ac.at/cgi-bin/man/man2html?1+auto-apt

Braiam
la source
0

L'installation automatique serait une mauvaise idée. Si vous souhaitez enregistrer une saisie, vous pouvez utiliser

sudo apt-get install !!

!!sera remplacé par la dernière commande de l'historique. Vous pourriez probablement en faire un alias également, mais je ne sais pas comment l'ajouter !!sans l'évaluer.

Il y a cependant quelques mises en garde, comme l'ont mentionné @ eliah-kagan et @gertvdijk dans les commentaires. Certains programmes n'ont pas le même nom de package que le binaire que vous exécuteriez. En outre, lorsque vous passez des arguments au binaire, cela peut entraîner des résultats inattendus.

l3dx
la source
Bien sûr, je sais que ma suggestion n'est pas une excellente solution, mais elle pourrait fonctionner "assez bien" en fonction des besoins des utilisateurs.
l3dx
5
Les noms de commande (nom de fichier du binaire sur le système) ne sont pas nécessairement les mêmes que le nom du package.
gertvdijk
3
l3dx: Bien que j'ai toujours mes doutes (y compris le point de @ gertvdijk selon lequel les noms de package et de commande sont souvent différents, ainsi que les inquiétudes concernant les effets éventuellement très mauvais des arguments de ligne de commande supplémentaires passés à la commande d'origine), il semble que vous soyez sur quelque chose . Après quelques tests, il semble que cela fonctionne mieux en pratique que (je pense) en théorie. Je recommande toujours d'élargir cette réponse pour des éclaircissements, des avertissements et peut-être pour détailler d'autres options. Dans tous les cas, j'avais rétrogradé cela, mais j'ai supprimé mon downvote.
Eliah Kagan
0

Il existe quelques méthodes pour installer rapidement le package suggéré:

  • Ajouter export COMMAND_NOT_FOUND_INSTALL_PROMPT=1quelque part comme~/.bashrc

    c'est le moyen le plus "cool", bien que ce ne soit évidemment pas aussi sûr, mais probablement 90% du temps provoquera un "Merci, c'est exactement ce que je voulais que vous fassiez!" réponse.

    (Un inconvénient personnel de cette méthode est que je semble trouver la réponse difficile à retenir / rechercher, donc j'ai tendance à ne pas l'avoir beaucoup utilisée jusqu'à présent.)

  • Si vous utilisez le terminal par défaut, vous pouvez sélectionner rapidement la ligne et cliquer avec le bouton du milieu pour la coller directement dans la ligne de commande. (D'autres terminaux ou applications SSH peuvent avoir des méthodes différentes.)

    En pratique, j'ai tendance à trouver cela assez rapidement, et un peu plus difficile à faire "accidentellement", et sans nécessiter de configuration préalable, que j'ai tendance à le faire à la place.

  • Il y a cependant quelque chose à dire - si vous pouvez (ou voulez apprendre) taper rapidement - pour taper sudo apt install packagenamedirectement.

    Il vous aide à exercer votre mémoire musculaire et signifie également que vous devez lire et taper le nom du package, ce qui signifie que vous vous en souviendrez probablement plus facilement à l'avenir. C'est aussi un peu plus facile dans les versions Ubuntu plus récentes, car aptfonctionne à la place de apt-get.

mwfearnley
la source
1
Vous vouliez probablement dire ~/.bashrcau lieu de ~/.bash_rc.
edwinksl
Merci, je pensais probablement à .bash_profile.
mwfearnley