Problème avec $ PATH et le fichier exécutable

8

J'ai un fichier exécutable Unix situé dans un répertoire que j'ai généré. Je crois que je dois obtenir ce répertoire dans mon $PATHafin que l'exécutable unix soit exécutable, mais la documentation du code source dit que je dois modifier mon fichier de configuration de shell pour l'ajouter $home/meme/binau chemin de mon shell.

dr.bunsen
la source

Réponses:

10

Si vous souhaitez pouvoir exécuter un programme en tapant son nom sur la ligne de commande, l'exécutable du programme doit se trouver dans l'un des répertoires répertoriés dans la PATHvariable d'environnement. Vous pouvez voir la valeur actuelle de la variable comme ceci ( $c'est votre invite, et la valeur ci-dessous est un exemple):

$ echo $PATH
/home/drbunsen/bin:/usr/local/bin:/usr/bin:/bin

Vous avez plusieurs choix; alors que les # 1 et # 2 impliquent des concepts moins avancés, je recommande le # 3 qui demande moins de travail en pratique:

  • Vous pouvez placer l'exécutable dans un répertoire qui se trouve déjà sur votre PATH. Par exemple, si /home/drbunsen/binest déjà sur votre PATH, vous pouvez y mettre l'exécutable. Ou vous pouvez mettre l'exécutable /usr/local/binsi vous voulez qu'il soit disponible pour tous les utilisateurs.
  • Vous pouvez ajouter le répertoire où se trouve l'exécutable dans votre PATH. Modifiez le fichier ~/.profile( ~/signifie que le fichier se trouve dans votre répertoire personnel) (créez le fichier s'il n'existe pas). Ajoutez une ligne comme celle-ci:

    PATH=$PATH:$HOME/meme/bin
    

    (Notez que ce n'est $HOMEpas le cas $home; unix est généralement sensible à la casse. Vous pouvez également écrire ~/meme/bin, ~est un synonyme $HOMElorsqu'il se trouve au début d'un chemin de fichier.) Le changement prendra effet la prochaine fois que vous vous connecterez. Vous pouvez taper ceci même ligne dans un terminal, et cela affectera le shell exécuté dans ce terminal et tout programme lancé à partir de celui-ci.

  • L'approche que je recommande est de conserver l'exécutable avec les autres fichiers qui font partie du programme, dans un répertoire qui lui est propre, mais pas de changer PATHnon plus.
    Garder l'exécutable $HOME/memea l'avantage que si vous souhaitez supprimer ou mettre à niveau le programme, tout est au même endroit. Certains programmes en ont même besoin pour trouver les fichiers qu'ils utilisent. Le fait de ne pas changer PATHprésente l'avantage que l'installation et la désinstallation de programmes nécessitent moins de travail.
    Pour tirer le meilleur parti des deux mondes, créez un lien symbolique dans un répertoire sur votre PATH, pointant vers l'exécutable réel. À partir de la ligne de commande, exécutez une commande comme celle-ci:

    cd ~/bin
    ln -s ../meme/bin/* .
    

    Cela suppose que ~/binc'est déjà sur votre PATH; si ce n'est pas le cas, ajoutez-le ~/.profilecomme indiqué ci-dessus. Choisissez un autre endroit si vous le souhaitez. Désormais, rendre les programmes disponibles consiste à créer des liens symboliques; les rendre indisponibles consiste à supprimer les liens symboliques; et vous pouvez facilement suivre les programmes que vous avez installés manuellement et leur emplacement en consultant les liens symboliques.

Gilles 'SO- arrête d'être méchant'
la source
Gilles, wow merci BEAUCOUP pour l'explication détaillée. J'apprécie vraiment votre aide. Merci d'avoir pris le temps de répondre à ma question en détail et à un niveau qui a rendu tout clair.
dr.bunsen
Une autre chose que j'ai remarquée est que dans le répertoire home / meme / il ne semble pas y avoir de répertoire / bin. Dois-je créer un bac pour pouvoir faire un lien symbolique ici vers mon PATH? Merci.
dr.bunsen
@ dr.bunsen ~/binest un emplacement commun, et certaines distributions le créent automatiquement. Si ce n'est pas le cas, vous devrez le créer et l'ajouter PATHmanuellement. L'emplacement ~/binest juste une convention, vous pouvez choisir un autre nom si vous le souhaitez.
Gilles 'SO- arrête d'être méchant'
La commande générique ne fonctionne pas car ln interprète le dernier élément de l'expansion comme un répertoire: "Utilisation: ln [OPTION] ... [-T] TARGET LINK_NAME (1er formulaire) ou: ln [OPTION] ... TARGET ( 2e forme) ou: ln [OPTION] ... CIBLE ... RÉPERTOIRE (3e forme) ou: ln [OPTION] ... -t RÉPERTOIRE CIBLE ... (4e forme) "Pour résoudre ce problème, j'ai ajouté" - t ./ "
adam.r
1
@ adam.r J'ai écrit ln -s ../meme/bin/* ., non ln -s ../meme/bin/*. Il semble que vous ayez manqué un caractère lors de la copie de la commande.
Gilles 'SO- arrête d'être méchant'