Variables d'environnement dans Mac OS X

mise à jour: le lien sous n'a pas de réponse complète . Devoir définir le chemin ou la variable à deux endroits (un pour GUI et un pour shell) est boiteux.

Pas de Doublon de : définition des variables d'environnement sous OS X?


venant d'un fond Windows où il est très facile de définir et de modifier des variables d'environnement (allez juste à système Propriétés > avancées > Variables D'environnement), il ne semble pas être que simple sur Mac OS 10.5. La plupart des références disent que je devrais mettre à jour/etc /profile ou~/.profil. S'agit-il de L'équivalent des Variables du système et des Variables de L'utilisateur? Par exemple, Où dois-je régler ma variable JAVA_HOME ?


EDIT:

je veux pouvoir accéder à la variable à partir du terminal ainsi qu'à une application comme Eclipse. Aussi, j'espère que je n'ai pas il faut redémarrer/déconnecter pour que cela prenne effet.

172
demandé sur Community 2009-03-02 23:07:20

8 réponses

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.-à-d. tout ce que vous commencez à partir de Spotlight) en utilisant launchctl setenv .

par exemple, si vous voulez faire un miroir de votre chemin courant 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 aurez besoin de relancer les demandes pour obtenir la mise à jour variables d'environnement (même si vous pouvez simplement définir des variables dans votre shell, par exemple PATH=whatever:you:want ; il n'est pas nécessaire de relancer le terminal).

134
répondu Matt Curtis 2018-04-05 01:32:11

Il y a 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 à partir du terminal (notez que, contrairement à Linux, tous les shells ouverts dans le Terminal.app sont shells de login).
  • ~/.bashrc : ceci est invoqué pour les shells qui ne sont pas des shells de connexion. L'utiliser pour des alias et d'autres choses qui doivent être redéfinie dans les sous-coquille, pas pour variables d'environnement héritées.
  • /etc/profile : ceci est chargé avant ~/.profil, mais est autrement équivalent. Utilisez-le quand vous voulez que la variable s'applique aux programmes terminaux 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 les interfaces graphiques, à l'exception de celles lancées par Spotlight en 10.5 (pas 10.6). Vous devez vous déconnecter et vous connecter encore une fois, que les changements entrent en vigueur. Ce fichier n'est plus supporté depuis OS X 10.8.
  • instance de votre utilisateur launchd : ceci s'applique à tous les programmes lancés par l'utilisateur, GUI et CLI. Vous pouvez appliquer des modifications à tout moment en utilisant la commande setenv dans launchctl . en théorie , vous devriez être en mesure de mettre setenv commandes dans ~/.launchd.conf , et launchd les lirait automatiquement lorsque l'utilisateur se connecte, mais en pratique soutien pour ce fichier n'a jamais été mis en œuvre. 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 : ceci est lu par launchd lorsque le système démarre et lorsqu'un utilisateur se connecte. Ils affectent tous les processus sur le système, parce que launchd est le processus racine. Pour appliquer des modifications au lancement root en cours d'exécution, vous pouvez insérer les commandes dans sudo launchctl .

les choses fondamentales à comprendre sont:

  • les variables d'environnement sont héritées par les enfants d'un processus au moment où ils sont fourchés.
  • le processus root est une instance de launchd, et il y a aussi une instance de 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 alors hérité par tous les nouveaux processus de fourche.

exemple de configuration 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 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>

alors vous pouvez mettre setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE à l'intérieur ~/.launchd.conf , et il sera exécuté à chaque connexion.

notez que lorsque vous insérez une liste de commandes dans launchctl de cette façon, 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" .

aussi, notez que d'autres programmes qui tournent à la connexion peuvent s'exécuter avant le lanceur, et donc ne pas voir les variables d'environnement qu'il fixe.

278
répondu LaC 2016-12-30 19:58:33

je pense que ce que L'OP cherche est une solution simple, semblable à windows.

ici ya go:

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

12
répondu Tom Teman 2013-11-12 22:56:31

vous pouvez lire sur linux, ce qui est assez proche de ce qu'est Mac OS X. 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 mettre ma variable JAVA_HOME?"

  • Ne vous plusieurs utilisateurs? Font-ils des soins? Pourriez-vous changer un autre utilisateur en changeant un /etc/profile ?

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

7
répondu S.Lott 2009-03-02 20:13:52

pour les applications GUI, vous devrez créer et éditer ~/.MacOSX/environment.plist . Plus de détails ici . Vous devez vous connecter pour ces afin de prendre effet. Je ne suis pas sûr qu'ils affectent aussi les applications lancées à partir du Terminal, mais je suppose qu'ils le feront.

pour les applications lancées depuis le Terminal, vous pouvez également éditer le~/.le fichier de profil.

5
répondu JW. 2009-03-02 20:27:42

il suffit d'ouvrir le fichier ~/.profile , via nano dans le Terminal et d'y taper:

export PATH=whatever/you/want:$PATH

Sauvegardez ce fichier (cmd+X et Y). Après cela veuillez vous déconnecter / vous connecter à nouveau ou simplement ouvrir un nouvel onglet dans le Terminal et essayer d'utiliser votre nouvelle variable.

s'il vous PLAÎT N'oubliez PAS d'ajouter ":$PATH" après ce que/vous/voulez-vous, sinon, vous allez effacer tous les chemins dans la variable PATH, qui étaient là avant.

3
répondu Migele 2012-06-06 23:24:51

synchronisez les variables D'environnement OS X pour les applications en ligne de commande et GUI à partir d'une seule source avec osx-env-sync .

j'ai aussi posté une réponse à une question connexe ici .

3
répondu Ersin Er 2017-05-23 11:54:59

si vous voulez changer les variables d'environnement de façon permanente sur El Capitan, mettez-les dans /etc/paths . Note , ce fichier est en lecture seule par défaut, vous aurez donc à chmod pour les autorisations d'écriture.

0
répondu Igor Ganapolsky 2015-11-29 21:10:04