198 votes

Variables d'environnement dans Mac OS X

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

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


Je viens d'un environnement Windows où il est très facile de définir et de modifier les variables d'environnement (il suffit d'aller dans Propriétés système > Avancé > Variables d'environnement), mais cela ne semble pas être aussi simple sous Mac OS 10.5. La plupart des références indiquent que je dois mettre à jour /etc/profile ou ~/.profile. S'agit-il de l'équivalent des variables système et des variables utilisateur ? Par exemple, où dois-je placer mon JAVA_HOME variable ?


EDIT :

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

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

307voto

LaC Points 7191

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 &lt; ~/.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

Merci, cette explication est vraiment géniale !

3 votes

En fait, concernant ~/.MacOSX/environment.plist sur mon Lion, il est lu et utilisé. Je viens de le tester. En fait, je le préfère au fichier .launchd.conf parce que j'utilise le fichier RCenvironnement pour le gérer.

0 votes

D'accord, environment.plist fonctionne bien sur Lion, je l'utilise aussi. Mais ce n'est pas forcément une solution d'avenir... !

151voto

Matt Curtis Points 12454

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 la commande launchctl setenv .

Par exemple, si vous voulez refléter votre chemin actuel dans launchd après l'avoir configuré dans .bashrc ou n'importe où :

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 les variables dans votre interpréteur de commandes, par ex. PATH=whatever:you:want ; il n'est pas nécessaire de relancer le terminal).

1 votes

Cela semble être la meilleure réponse jusqu'à présent, pas besoin d'une application tierce !

4 votes

Cela ne semble pas être global : les variables d'environnement définies de cette manière sont locales à l'utilisateur. Nous n'avons toujours pas de mondial mécanisme pour définir une variable d'environnement.

0 votes

@Andrew Que voulez-vous dire par "local à l'utilisateur" ? Je m'attendrais à ce que tous les processus lancés ultérieurement par launchd soient affectés.

12voto

Tom Teman Points 847

Je pense que ce que l'OP recherche est une solution simple, de type Windows.

C'est parti :

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

1 votes

Wow, ça a l'air cool. Je ne l'ai pas encore essayé mais il semble que c'est exactement ce dont j'avais besoin d'après la description.

6 votes

btw, le lien original semble avoir cassé depuis que je l'ai posté (quel est le problème Apple ? les 301 sont chers ?). Vous pouvez utiliser ce lien à la place : macupdate.com/app/mac/14617/rcenvironnement

0 votes

C'est vraiment vieux. Consultez l'autre réponse qui mentionne osx-env-sync pour une solution moderne qui fonctionne même sous OS X 10.10 (Yosemite) et plus.

8voto

S.Lott Points 207588

Vous pouvez vous documenter sur linux, qui est assez proche de ce qu'est Mac OS X. Ou vous pouvez vous renseigner sur BSD Unix, qui est un peu plus proche. Dans la plupart des cas, les différences entre Linux et BSD ne sont pas très importantes.

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

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

"Où dois-je placer ma variable JAVA_HOME ?"

  • Avez-vous plusieurs utilisateurs ? Sont-ils concernés ? Pourriez-vous perturber un autre utilisateur en changeant un /etc/profile ?

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

5voto

JW. Points 17361

Pour les applications GUI, vous devrez créer et modifier ~/.MacOSX/environment.plist . Plus de détails ici . Vous devrez vous déconnecter pour qu'elles prennent effet. Je ne sais pas si elles affectent également les applications lancées à partir du terminal, mais je suppose que ce serait le cas.

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

2 votes

Oui, Terminal héritera des variables, comme tout ce qui est lancé depuis Terminal. Vous pouvez utiliser les RCenvironnement pour gérer les variables.

1 votes

Cette solution ne fonctionne plus avec certaines révisions de Mac OS X v10.7. Elle ne fonctionne pas non plus avec les révisions de Mac OS X v10.8 ou plus. A la place, voir : stackoverflow.com/a/4567308/543738

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X