Il existe plusieurs endroits où vous pouvez définir des variables d'environnement.
-
~/.profile
: utilisez-le pour les variables que vous souhaitez définir dans tous les programmes lancés depuis le terminal (notez que, contrairement à ce qui se passe sous Linux, tous les shells ouverts dans Terminal.app sont des shells de connexion).
-
~/.bashrc
Cette option est invoquée pour les shells qui ne sont pas des shells de connexion. Utilisez ceci pour les alias et autres choses qui doivent être redéfinies dans les sous-shells, pas pour les variables d'environnement qui sont héritées.
-
/etc/profile
Ce fichier est chargé avant ~/.profile, mais il est équivalent. Utilisez-le lorsque vous voulez que la variable s'applique aux programmes terminaux lancés par tous les utilisateurs de la machine (en supposant qu'ils utilisent bash).
-
~/.MacOSX/environment.plist
Ce champ est lu par la fenêtre de connexion lors de la connexion. Il s'applique à toutes les applications, y compris les interfaces graphiques, à l'exception de celles lancées par Spotlight en 10.5 (pas en 10.6). Il faut se déconnecter et se reconnecter pour que les changements soient pris en compte. Ce fichier n'est plus pris en charge à partir de OS X 10.8.
- de votre utilisateur
launchd
instance : ceci s'applique à tous les programmes lancés par l'utilisateur, GUI et CLI. Vous pouvez appliquer les changements à tout moment en utilisant la fonction setenv
dans launchctl
. En théorie vous devriez être capable de mettre setenv
commandes dans ~/.launchd.conf
et launchd
les lirait automatiquement lorsque l'utilisateur se connecte, mais en pratique, le support de ce fichier n'a jamais été implémenté. Au lieu de cela, vous pouvez utiliser un autre mécanisme pour exécuter un script lors de la connexion, et faire en sorte que ce script fasse appel à launchctl
pour mettre en place le launchd
l'environnement.
-
/etc/launchd.conf
Le fichier de configuration : il est lu par launchd au démarrage du système et lorsqu'un utilisateur se connecte. Elles affectent tous les processus du système, car launchd est le processus racine. Pour appliquer des changements au processus racine launchd en cours d'exécution, vous pouvez placer les commandes dans le fichier sudo launchctl
.
Les éléments fondamentaux à comprendre sont les suivants :
- Les variables d'environnement sont héritées par les enfants d'un processus au moment où ils sont bifurqués.
- le processus racine est une instance launchd, et il y a également une instance launchd séparée par session utilisateur.
- launchd vous permet de changer ses variables d'environnement actuelles en utilisant
launchctl
les variables mises à jour sont ensuite héritées par tous les nouveaux processus qu'il bifurque à partir de ce moment-là.
Exemple de définition d'une variable d'environnement avec launchd :
echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl
Maintenant, lancez votre application GUI qui utilise la variable, et voilà !
Pour contourner le fait que ~/.launchd.conf
ne fonctionne pas, vous pouvez mettre le script suivant en ~/Library/LaunchAgents/local.launchd.conf.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl < ~/.launchd.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Ensuite, vous pouvez mettre setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE
à l'intérieur de ~/.launchd.conf
et il sera exécuté à chaque connexion.
Notez que, lorsque vous introduisez une liste de commandes dans launchctl de cette manière, vous ne pourrez pas définir de variables d'environnement avec des valeurs contenant des espaces. Si vous avez besoin de le faire, vous pouvez appeler launchctl comme suit : launchctl setenv MYVARIABLE "QUOTE THE STRING"
.
Notez également que d'autres programmes qui s'exécutent au moment de la connexion peuvent être exécutés avant l'agent de lancement, et donc ne pas voir les variables d'environnement qu'il définit.
0 votes
Et il y a quelques conseils dans les réponses à la question du lien qui ne sont pas répétés ici...