Variables d’environnement sous Mac OS X

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

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


Venant d’un arrière-plan Windows où il est très facile de définir et de modifier les variables d’environnement (allez simplement dans Propriétés du système> Avancé> Variables d’environnement), cela ne semble pas si simple sous Mac OS 10.5. La plupart des références disent que je devrais mettre à jour / etc / profile ou ~ / .profile. Sont-ils l’équivalent des variables système et des variables utilisateur? Par exemple, où dois-je définir ma variable JAVA_HOME ?


MODIFIER:

Je veux pouvoir accéder à la variable depuis le terminal ainsi qu’une application comme Eclipse. En outre, j’espère ne pas avoir à redémarrer / déconnecter pour que cela prenne effet.

Il n’y a pas besoin de duplication. Vous pouvez définir des variables d’environnement utilisées par launchd (et les processus enfants, c.-à- launchctl setenv . launchctl setenv ce que vous démarrez depuis Spotlight) en utilisant launchctl setenv .

Par exemple, si vous souhaitez 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 relancer le terminal).

Il existe plusieurs endroits où vous pouvez définir des variables d’environnement.

  • ~/.profile : utilisez ceci pour les variables que vous voulez 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 : il est appelé pour les shells qui ne sont pas des shells de connexion. Utilisez cette option pour les alias et autres éléments à redéfinir dans les sous-couches, et non pour les variables d’environnement héritées.
  • /etc/profile : ceci est chargé avant ~ / .profile, mais est par ailleurs équivalent. Utilisez-le lorsque vous souhaitez que la variable s’applique aux programmes de terminal 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. Elle s’applique à toutes les applications, y compris celles de l’interface graphique, à l’exception de celles lancées par Spotlight au 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.
  • instance de launchd votre utilisateur: ceci 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 commande setenv dans launchctl . En théorie , vous devriez pouvoir placer les commandes setenv dans ~/.launchd.conf , et launchd les lirait automatiquement lorsque l’utilisateur se connecte, mais dans la 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 lors de la connexion et demander à ce script de launchctl pour configurer l’environnement launchd .
  • /etc/launchd.conf : ceci est lu par launchd au démarrage du système et lorsqu’un utilisateur se connecte. Ils affectent tous les processus du système, car launchd est le processus racine. Pour appliquer les modifications à la racine en cours d’exécution launchd, 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 où elles sont générées.
  • 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’elles forcent à 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 graphique qui utilise la variable, et le tour est joué!

Pour contourner le fait que ~/.launchd.conf ne fonctionne pas, vous pouvez placer 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">   Label local.launchd.conf ProgramArguments  sh -c launchctl < ~/.launchd.conf  RunAtLoad    

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

Notez que lorsque vous lancez 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 devez le faire, vous pouvez appeler launchctl comme suit: launchctl setenv MYVARIABLE "QUOTE THE STRING" .

Notez également que les autres programmes exécutés lors de la connexion peuvent s’exécuter avant le lanceur, et peuvent donc ne pas voir les variables d’environnement définies.

Je pense que ce que l’OP recherche est une solution simple, semblable à une fenêtre.

voici ça:

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

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ù dois-je définir ma variable JAVA_HOME?”

  • Avez-vous plusieurs utilisateurs? Est-ce qu’ils s’en soucient? Voulez-vous gâcher un autre utilisateur en modifiant un /etc/profile ?

En général, je préfère ne pas gâcher les parameters système même si je suis le seul utilisateur. Je préfère modifier mes parameters locaux.

Pour les applications GUI, 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 suis pas sûr qu’ils affectent également les applications lancées à partir de Terminal, mais je suppose qu’ils le feraient.

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

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 / reconnectez-vous ou ouvrez simplement un nouvel onglet dans Terminal et essayez d’utiliser votre nouvelle variable.

VEUILLEZ NE PAS oublier d’append “: $ PATH” après tout / vous / voulez, sinon vous effacerez tous les chemins de la variable PATH, qui étaient là avant cela.

Synchroniser 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 .

Si vous voulez changer les variables d’environnement de manière permanente sur El Capitan, définissez-les dans /etc/paths . Notez que ce fichier est en lecture seule par défaut, vous devrez donc chmod pour les permissions d’écriture.