Il existe plusieurs endroits où vous pouvez définir des variables d'environnement.
~/.profile
: utilisez ceci pour les variables que vous souhaitez définir dans tous les programmes lancés depuis le terminal (notez que, contrairement à Linux, tous les shells ouverts dans Terminal.app sont des shells de connexion).
~/.bashrc
: ceci est appelé 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-interpréteurs, pas pour les variables d'environnement héritées.
/etc/profile
: ceci est chargé avant ~ / .profile, mais est autrement équivalent. Utilisez-le lorsque vous voulez que la variable s'applique aux programmes de terminal lancés par tous les utilisateurs sur la machine (en supposant qu'ils utilisent bash).
~/.MacOSX/environment.plist
: ceci est lu par loginwindow lors de la connexion. Il s'applique à toutes les applications, y compris celles de l'interface graphique, à l'exception de celles lancées par Spotlight dans 10.5 (et non 10.6). Vous devez vous déconnecter et vous reconnecter pour que les modifications prennent effet. Ce fichier n'est plus pris en charge à partir d'OS X 10.8.
- l'
launchd
instance de votre utilisateur : cela s'applique à tous les programmes lancés par l'utilisateur, l'interface graphique et la CLI. Vous pouvez appliquer des modifications à tout moment en utilisant la setenv
commande dans launchctl
. En théorie , vous devriez pouvoir insérer des setenv
commandes ~/.launchd.conf
et launchd
les lire automatiquement lorsque l'utilisateur se connecte, mais en pratique, la prise en charge de ce fichier n'a jamais été implémentée. Au lieu de cela, vous pouvez utiliser un autre mécanisme pour exécuter un script à la connexion et faire appel launchctl
à ce script pour configurer l' launchd
environnement.
/etc/launchd.conf
: ceci est lu par launchd lorsque le système démarre et lorsqu'un utilisateur se connecte. Ils affectent chaque processus du système, car launchd est le processus racine. Pour appliquer des modifications au launchd racine en cours d'exécution, vous pouvez diriger les commandes vers sudo launchctl
.
Les choses fondamentales à comprendre sont:
- les variables d'environnement sont héritées par les enfants d'un processus au moment de leur fork.
- le processus racine est une instance launchd, et il existe également une instance launchd distincte par session utilisateur.
- launchd vous permet de modifier ses variables d'environnement actuelles en utilisant
launchctl
; les variables mises à jour sont alors héritées par tous les nouveaux processus qu'il forge à partir de 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 le tour est joué!
Pour contourner le fait que ~/.launchd.conf
cela ne fonctionne pas, vous pouvez insérer le script suivant ~/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 à l' setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE
intérieur ~/.launchd.conf
, et il sera exécuté à chaque connexion.
Notez que, lorsque vous redirigez 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 à la connexion peuvent s'exécuter avant le launchagent, et donc ne pas voir les variables d'environnement qu'il définit.