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é 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 le PATH
.
Le shell recherche les programmes dans l' PATH
ordre, de gauche à droite. S'il y a deux ls
programmes 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/paths
sont ajoutés PATH
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
et zsh
, 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 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=bar
définit la FOO
variable 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.
$PATH
et ${PATH}
sont généralement interchangeables. Ils indiquent au shell d'étendre la PATH
valeur 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 echo
commande, 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 echo
utilise la syntaxe d'accolade, il permet au shell de voir que vous demandez la FOO
variable et que x
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:
$ echo "$FOO"x
barx
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 é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' FOO
exemple ci-dessus , si vous deviez exécuter un autre programme, il ne verrait pas la FOO
variable 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 bash
shell sous celui que j'utilisais déjà, puis j'essaie d'afficher la valeur FOO
, j'obtiens un blanc car il FOO
n'a pas été exporté pour que les sous-programmes le voient. Ensuite, j'ai quitté la deuxième bash
instance, je l'ai exportée, j'ai exécuté de bash
nouveau, et maintenant la deuxième instance voit la valeur de FOO
.
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.