Qu'est-ce que PATH
dans 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 PATH
et quelle est la différence entre /etc/paths
et ~/.bash_profile
**?
Par exemple, dans mon paths
dossier, 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' paths
utilisateur du fichier? Dans quoi tout ça paths
, comme /usr/bin
?
Réponses:
1. Quel est le but de PATH?
PATH
est 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 votrejsdoc
exemple). Ainsi, si votrePATH
aalors 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/paths
est utilisé pour définirPATH
globalement (c'est-à-dire à l' échelle du système, pour tous les utilisateurs) tandis que~/.bash_profile
est utilisé pour définir les préférences par utilisateur (où~
sera le répertoire personnel de l'utilisateur). Ce qui est écrit.bash_profile
peut s'ajouter au globalPATH
de/etc/paths
ou le remplacer complètement.Pour mémoire, cela
/etc/paths
semble être une particularité de MAC OS: je ne l'ai pas rencontré sur GNU / Linux, du moins.la source
/etc/paths
sur OSX.C'est ainsi que votre shell trouve des programmes. Lorsque vous tapez
ls
, par exemple, cela exécute un programme appeléls
qui réside/bin
sur la plupart des systèmes, y compris Mac OS X. Votre shell ne peut le trouver que parce qu'il se/bin
trouve dans lePATH
.Le shell recherche les programmes dans l'
PATH
ordre, de gauche à droite. S'il y a deuxls
programmes sur votre système et que leurs répertoires sont tous les deux dans votrePATH
, il trouvera celui dans le répertoire indiqué en premier dans votrePATH
.Les chemins d'accès définis
/etc/paths
sont ajoutésPATH
au démarrage dans tous les shells sur Mac OS X.~/.bash_profile
n'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étcsh
etzsh
, par exemple, les modifications apportées/etc/bashrc
ne s'appliquent pas à votre nouveau shell.Il
/etc/paths
s'agit également d'un fichier de configuration au niveau du système, alors qu'il~/.bash_profile
est par utilisateur. Si vous aviez plusieurs utilisateurs interactifs configurés sur votre Mac, vous ne voudriez pas ajouter des répertoires/etc/paths
auxquels vous ne vouliez pas apparaître dans tout le mondePATH
. 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.Vous ne voyez généralement la variable sans le sceau lorsque vous définissez la variable.
FOO=bar
définit laFOO
variable d'environnement sur la chaînebar
. Si vous tapezset
, le shell vous montre toutes les variables d'environnement, et dans ce cas, vous voyez également la variable sans aucun sigil.$PATH
et${PATH}
sont généralement interchangeables. Ils indiquent au shell d'étendre laPATH
valeur de la variable actuelle sur place. La différence a à voir avec comment et où vous les utilisez. Par exemple:Dans la deuxième
echo
commande, le shell n'imprime rien car il lui demande d'imprimer une variable appeléeFOOx
, qui n'existe pas; le shell traite les variables inexistantes comme vides. Étant donné que le troisièmeecho
utilise la syntaxe d'accolade, il permet au shell de voir que vous demandez laFOO
variable et quex
c'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:
Les variables d'environnement sont développées entre guillemets doubles, et les guillemets séparent l'
x
extension de la variable afin que le shell fasse ce qu'il faut.J'utilise la
FOO
variable d'environnement ici juste pour plus de clarté. Tout ce que j'ai écrit ci-dessus s'applique égalementPATH
, car il s'agit simplement d'une autre variable d'environnement. Les textes d'exemple seraient juste beaucoup plus longs.En prenant l'
FOO
exemple ci-dessus , si vous deviez exécuter un autre programme, il ne verrait pas laFOO
variable car elle n'est pas exportée. Il ne vit que dans cette seule instance de shell:Lorsque j'exécute un nouveau
bash
shell sous celui que j'utilisais déjà, puis j'essaie d'afficher la valeurFOO
, j'obtiens un blanc car ilFOO
n'a pas été exporté pour que les sous-programmes le voient. Ensuite, j'ai quitté la deuxièmebash
instance, je l'ai exportée, j'ai exécuté debash
nouveau, et maintenant la deuxième instance voit la valeur deFOO
.Vous utilisez
export
lorsque 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.
la source