web-dev-qa-db-fra.com

Variables d'environnement sous Mac OS X

Mise à jour: Le lien ci-dessous n'a pas de réponse complète . Devoir définir le chemin ou la variable à deux endroits (un pour l'interface graphique et un pour Shell) est nul.

Pas de duplication de : Définition des variables d'environnement dans OS X?


Venant d'un environnement Windows où il est très facile de définir et de modifier des variables d'environnement (allez simplement dans Propriétés système> Avancé> Variables d'environnement), cela ne semble pas être aussi simple sous Mac OS 10.5. La plupart des références disent que je devrais mettre à jour/etc/profile ou ~/.profile. S'agit-il de variables système et de variables utilisateur? Par exemple, où devrais-je définir ma variable Java_HOME?


MODIFIER:

Je veux pouvoir accéder à la variable à partir du terminal ainsi qu'à une application comme Eclipse. De plus, j'espère ne pas avoir à redémarrer/déconnecter pour que cela prenne effet.

181
Abdullah Jibaly

Il n'y a pas besoin de duplication. Vous pouvez définir les variables d’environnement utilisées par launchd (et les processus enfants, c’est-à-dire tout ce que vous démarrez à partir de Spotlight) à l’aide de launchctl setenv.

Par exemple, si vous voulez mettre en miroir votre chemin actuel dans launchd après l'avoir configuré dans .bashrc ou ailleurs:

PATH=whatever:you:want
launchctl setenv PATH $PATH

Les variables d'environnement ne sont pas automatiquement mises à jour dans les applications en cours d'exécution. Vous devrez relancer les applications pour obtenir les variables d'environnement mises à jour (bien que vous puissiez simplement définir des variables dans votre shell, par exemple PATH=whatever:you:want; il n'est pas nécessaire de redémarrer le terminal).

140
Matt Curtis

Vous pouvez définir des variables d’environnement à plusieurs endroits.

  • ~/.profile: utilisez cette option 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 login. Utilisez cette option pour les alias et autres éléments devant être redéfinis dans des sous-shell, et non pour les variables d'environnement héritées.
  • /etc/profile: ceci est chargé avant ~/.profile, mais est équivalent. Utilisez-le lorsque vous souhaitez que la variable s'applique aux programmes de terminaux lancés par tous les utilisateurs de 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 à interface graphique, à l'exception de celles lancées par Spotlight dans 10.5 (et non dans 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 de OS X 10.8.
  • instance launchd de votre utilisateur: elle s'applique à tous les programmes lancés par l'utilisateur, à l'interface graphique et à la CLI. Vous pouvez appliquer des modifications à tout moment à l'aide de la commande setenv dans launchctl. En théorie, vous devriez pouvoir mettre les commandes setenv dans ~/.launchd.conf, et launchd les lirait automatiquement lorsque l'utilisateur se connectera, mais dans la pratique, 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 le faire appeler launchctl pour configurer l'environnement launchd.
  • /etc/launchd.conf: il est lu par launchd au démarrage du système et à la connexion d'un utilisateur. Ils affectent tous les processus du système, car launchd est le processus racine. Pour appliquer les modifications à la racine en cours de lancement, 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 création.
  • 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 à l'aide de launchctl; les variables mises à jour sont ensuite héritées par tous les nouveaux processus qu’elle redemande ensuite.

Exemple de définition d'une variable d'environnement avec launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Maintenant, lancez votre application graphique qui utilise la variable, et le tour est joué!

Pour contourner le fait que ~/.launchd.conf ne fonctionne pas, vous pouvez insérer le script suivant dans ~/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 &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Ensuite, vous pouvez insérer setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE dans ~/.launchd.conf et il sera exécuté à chaque connexion.

Notez que, lorsque vous pipelez 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 exécutés lors de la connexion peuvent s'exécuter avant le launchagent et ne pas voir les variables d'environnement définies.

289
LaC

Je pense que le PO recherche une solution simple, semblable à celle de Windows.

voilà

https://www.macupdate.com/app/mac/14617/rcenvironment

12
Tom Teman

Vous pouvez lire sur Linux, ce qui est assez proche de ce que Mac OS X est. Ou vous pouvez lire sur BSD Unix, qui est un peu plus proche. Pour la plupart, les différences entre Linux et BSD ne sont pas très importantes.

/etc/profile sont des variables d'environnement système.

~/.profile sont des variables d'environnement spécifiques à l'utilisateur.

"où devrais-je définir ma variable Java_HOME?"

  • Avez-vous plusieurs utilisateurs? S'en soucient-ils? Souhaitez-vous gâcher un autre utilisateur en changeant un /etc/profile?

En général, je préfère ne pas jouer avec les paramètres du système même si je suis le seul utilisateur. Je préfère modifier mes paramètres locaux.

7
S.Lott

Pour les applications graphiques, vous devrez créer et éditer ~/.MacOSX/environment.plist. Plus de détails ici . Vous devrez vous déconnecter pour que ceux-ci prennent effet. Je ne sais pas s'ils affectent également les applications lancées à partir de Terminal, mais je suppose qu'ils le feraient.

Pour les applications lancées à partir de Terminal, vous pouvez également modifier le fichier ~/.profile.

5
JW.

Ouvrez simplement le fichier ~/.profile, via nano dans Terminal et tapez:

export PATH=whatever/you/want:$PATH

Enregistrez ce fichier (cmd + X et Y). Après cela, déconnectez-vous/connectez-vous à nouveau ou ouvrez simplement un nouvel onglet dans Terminal et essayez d’utiliser votre nouvelle variable.

VEUILLEZ NE PAS oublier d’ajouter ": $ PATH" après n’importe quoi/vous voulez, sinon vous effacerez tous les chemins de la variable PATH, qui étaient là auparavant.

3
Migele

Synchronisez les variables d'environnement OS X pour les applications de ligne de commande et d'interface graphique à partir d'une source unique avec osx-env-sync.

J'ai également posté une réponse à une question connexe ici .

3
Ersin Er

Si vous souhaitez modifier les variables d'environnement de manière permanente sur macOS, définissez-les dans /etc/paths. Remarque , ce fichier est en lecture seule par défaut, il vous faudra donc chmod pour les autorisations en écriture.

0
IgorGanapolsky