Qu'est-ce que PATH sur Mac OS?

12

Qu'est-ce que PATHdans un Mac OS? Je l'ai utilisé pour installer des outils de ligne de commande globaux, mais la seule documentation que j'ai trouvée est des tutoriels pour le faire, sans aucune explication réelle de ce qui se passe sous le capot. Je n'ai pas non plus trouvé de page pertinente sur Wikipédia .

Alors, quel est le but de PATHet quelle est la différence entre /etc/pathset ~/.bash_profile**?

Par exemple, dans mon pathsdossier, je vois ceci:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

Mais dans mon ~/.bash_profile, je vois ceci:

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

S'agit-il simplement d'un ajout spécifique à l' pathsutilisateur du fichier? Dans quoi tout ça paths, comme /usr/bin?

gwg
la source
2
Veuillez ne pas combiner plusieurs questions dans un seul article. Chacune de vos questions serait la bienvenue ici séparément mais pas toutes ensemble comme ça. Veuillez réduire cela à une seule question, vous pouvez combiner 1 et 2 mais les autres n'ont rien à voir avec PATH spécifiquement. 3 est répondu ici 4 est expliqué ici et 5 n'a pas beaucoup de sens, je le crains. Pas plus que votre question bonus, quels fichiers sont binaires? Les scripts ne le sont pas.
terdon
J'ai édité ma question. J'ai également trouvé ces liens utiles. Merci.
gwg

Réponses:

15

1. Quel est le but de PATH?

PATHest une variable d'environnement qui contient une liste de répertoires séparés par deux points où votre shell recherchera les exécutables que vous nommez sur la ligne de commande sans leur fournir un chemin explicite (comme dans votre jsdocexemple). Ainsi, si votre PATHa

/usr/bin:/bin:/home/bin

alors tout exécutable que vous appelez par son nom sera recherché dans ces répertoires (dans cet ordre) et le premier exécutable trouvé est celui exécuté.

2. Quelle est la différence entre / etc / chemins et ~ / .bash_profile

Selon cette question sur ServerFault , /etc/pathsest utilisé pour définir PATHglobalement (c'est-à-dire à l' échelle du système, pour tous les utilisateurs) tandis que ~/.bash_profileest utilisé pour définir les préférences par utilisateur (où ~sera le répertoire personnel de l'utilisateur). Ce qui est écrit .bash_profilepeut s'ajouter au global PATHde /etc/pathsou le remplacer complètement.

Pour mémoire, cela /etc/pathssemble être une particularité de MAC OS: je ne l'ai pas rencontré sur GNU / Linux, du moins.

Joseph R.
la source
Je viens de les éditer, mais merci d'avoir répondu à toutes!
gwg
@ggundersen J'ai coupé ma réponse pour l'adapter à votre question modifiée.
Joseph R.
@ggundersen, vous voudrez peut-être également lire ma réponse et les liens qui s'y trouvent /etc/pathssur OSX.
terdon
7

Quel est le but de PATH?

C'est ainsi que votre shell trouve des programmes. Lorsque vous tapez ls, par exemple, cela exécute un programme appelé lsqui réside /binsur la plupart des systèmes, y compris Mac OS X. Votre shell ne peut le trouver que parce qu'il se /bintrouve dans le PATH.

Le shell recherche les programmes dans l' PATHordre, de gauche à droite. S'il y a deux lsprogrammes sur votre système et que leurs répertoires sont tous les deux dans votre PATH, il trouvera celui dans le répertoire indiqué en premier dans votre PATH.

Quelle est la différence entre / etc / chemins et ~ / .bash_profile

Les chemins d'accès définis /etc/pathssont ajoutés PATHau démarrage dans tous les shells sur Mac OS X.

~/.bash_profilen'est qu'un des nombreux scripts shell exécutés par Bash au démarrage, et plusieurs d'entre eux sont spécifiques à Bash. Par conséquent, si vous changez de shell, Mac OS X est également livré tcshet zsh, par exemple, les modifications apportées /etc/bashrcne s'appliquent pas à votre nouveau shell.

Il /etc/pathss'agit également d'un fichier de configuration au niveau du système, alors qu'il ~/.bash_profileest par utilisateur. Si vous aviez plusieurs utilisateurs interactifs configurés sur votre Mac, vous ne voudriez pas ajouter des répertoires /etc/pathsauxquels vous ne vouliez pas apparaître dans tout le monde PATH. La même chose est vraie pour /etc/bashrc, sauf que bien sûr cela ne s'applique qu'aux utilisateurs qui utilisent Bash comme shell.

Quelle est la différence entre PATH et $ PATH et $ {PATH}?

Vous ne voyez généralement la variable sans le sceau lorsque vous définissez la variable. FOO=bardéfinit la FOOvariable d'environnement sur la chaîne bar. Si vous tapez set, le shell vous montre toutes les variables d'environnement, et dans ce cas, vous voyez également la variable sans aucun sigil.

$PATHet ${PATH}sont généralement interchangeables. Ils indiquent au shell d'étendre la PATHvaleur de la variable actuelle sur place. La différence a à voir avec comment et où vous les utilisez. Par exemple:

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

Dans la deuxième echocommande, le shell n'imprime rien car il lui demande d'imprimer une variable appelée FOOx, qui n'existe pas; le shell traite les variables inexistantes comme vides. Étant donné que le troisième echoutilise la syntaxe d'accolade, il permet au shell de voir que vous demandez la FOOvariable et que xc'est juste un autre caractère que vous souhaitez imprimer immédiatement après.

Il y a une autre façon d'obtenir le même effet sans accolades, d'ailleurs:

$ echo "$FOO"x
barx

Les variables d'environnement sont développées entre guillemets doubles, et les guillemets séparent l' xextension de la variable afin que le shell fasse ce qu'il faut.

J'utilise la FOOvariable d'environnement ici juste pour plus de clarté. Tout ce que j'ai écrit ci-dessus s'applique également PATH, car il s'agit simplement d'une autre variable d'environnement. Les textes d'exemple seraient juste beaucoup plus longs.

Que signifie exporter PATH? Quand exportons-nous?

En prenant l' FOOexemple ci-dessus , si vous deviez exécuter un autre programme, il ne verrait pas la FOOvariable car elle n'est pas exportée. Il ne vit que dans cette seule instance de shell:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

Lorsque j'exécute un nouveau bashshell sous celui que j'utilisais déjà, puis j'essaie d'afficher la valeur FOO, j'obtiens un blanc car il FOOn'a pas été exporté pour que les sous-programmes le voient. Ensuite, j'ai quitté la deuxième bashinstance, je l'ai exportée, j'ai exécuté de bashnouveau, et maintenant la deuxième instance voit la valeur de FOO.

Vous utilisez exportlorsque vous voulez que les sous-programmes voient les valeurs définies dans le shell, et ne l'utilisez pas lorsque vous ne voulez pas que cela se produise.

En règle générale, je n'exporte pas de variables temporaires dans des scripts shell, car je ne veux pas qu'elles modifient le comportement des programmes exécutés à partir de ce script shell.

Je ne vais répondre à aucune de vos autres questions. Vous n'êtes censé poser qu'une seule question à la fois. Je n'ai répondu à ces questions que parce qu'elles sont vaguement liées. Tout le reste appartient à une question distincte.

Warren Young
la source