Variables d'environnement sous Mac OS X

186

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 le shell) est nul.

Pas de duplication de : Définition de variables d'environnement sous 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 (il suffit d'aller dans Propriétés système> Avancé> Variables d'environnement), cela ne semble pas être aussi simple que cela sur Mac OS 10.5. La plupart des références indiquent que je devrais 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 définir ma JAVA_HOMEvariable?


ÉDITER:

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

Abdullah Jibaly
la source
Et il y a quelques conseils dans les réponses à la question du lien qui ne sont pas répétées ici ...
dmckee --- ex-moderator chaton

Réponses:

142

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) en utilisantlaunchctl setenv .

Par exemple, si vous souhaitez mettre en miroir votre chemin actuel dans launchd après l'avoir configuré dans .bashrcou 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).

Matt Curtis
la source
1
On dirait la meilleure réponse à ce jour, pas besoin d'une application tierce!
Abdullah Jibaly
2
Cela ne semble pas être global: les variables d'environnement définies de cette manière sont locales pour l'utilisateur. Nous n'avons toujours pas de mécanisme global pour définir une variable d'environnement.
Andrew
@Andrew Que voulez-vous dire, local pour l'utilisateur? Je m'attendrais à ce que tous les processus lancés par la suite à partir de launchd soient affectés.
Matt Curtis
@MattCurtis: Les variables d'environnement définies via ne launchctl setenvsemblent être visibles que par l'utilisateur effectuant la modification. Si je définis une variable en tant qu'utilisateur ordinaire, elle n'est pas visible par root (via sudo) et vice-versa.
Andrew
2
@Andrew OK, root a son propre launchd - ps aux | grep launchdle montrera. Vérifiez également les man sudodocuments qui sudo(par défaut) réinitialisent délibérément l'environnement - si vous sudo -Econserverez l'environnement (y compris les variables avec lesquelles vous avez défini launchctl setenv). Avez-vous une application concrète pour cela, au fait? Si oui, cette méthode fonctionne-t-elle pour vous?
Matt Curtis
299

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' launchdinstance 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 setenvcommande dans launchctl. En théorie , vous devriez pouvoir insérer des setenvcommandes ~/.launchd.confet launchdles 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' launchdenvironnement.
  • /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.confcela 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 &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Ensuite, vous pouvez mettre à l' setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEinté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.

Lac
la source
3
En fait, concernant ~/.MacOSX/environment.plist, sur mon Lion, il est lu et utilisé. Je viens de le tester. Je le préfère en fait à .launchd.conf car j'utilise le volet de préférences RCenvironment pour le maintenir.
Gilimanjaro
5
Impossible ~/.launchd.confde travailler sur 10.6.8 - cela ne semble pas avoir d'effet. La page de manuel indique également que ce fichier n'est actuellement pas pris en charge.
snowcrash09
4
~ / .launchd.conf ne semble pas non plus fonctionner sur 10.7.3 et quand je regarde dans la page de manuel, il dit $ HOME / .launchd.conf Votre fichier de configuration launchd (actuellement non pris en charge)
non créatif
4
Dans 10.8 (Mountain Lion), ~ / .MacOSX / environment.plist n'est plus pris en charge. Selon Apple Dev, il faut «modifier le fichier Info.plist du .app lui-même pour qu'il contienne un dictionnaire« LSEnvironment »avec les variables d'environnement souhaitées». Pour plus d'informations, voir apple.stackexchange.com/questions/57385/…
pnkfelix
3
@LaC Excellent article complet; pourriez-vous s'il vous plaît le mettre à jour pour noter qu'il ~/.launchd.confn'est toujours pas pris en charge et ne fonctionne pas à partir d'OS X 10.8.3? Voirman launchd.conf
mklement0
12

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

c'est parti:

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

Tom Teman
la source
1
Wow, ça a l'air cool. Je n'ai pas encore essayé mais ressemble exactement à ce dont j'avais besoin dans la description.
Abdullah Jibaly
6
btw, le lien d'origine semble s'être rompu 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/rcenvironment
Tom Teman
C'est vraiment vieux. Découvrez 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.
Warren P
1
Veuillez résumer les informations du lien dans votre réponse. Comme nous l'avons déjà vu, les liens se rompent pour diverses raisons.
user3.1415927
7

Vous pouvez lire sur Linux, 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 définir ma variable JAVA_HOME?"

  • Avez-vous plusieurs utilisateurs? S'en soucient-ils? Souhaitez-vous déranger 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.

S.Lott
la source
5

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

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

JW.
la source
2
Oui, Terminal héritera des variables, de même que tout ce qui sera lancé depuis Terminal. Vous pouvez utiliser le volet de préférences RCenvironment pour gérer les variables.
Gilimanjaro
1
Cette solution ne fonctionne plus avec certaines révisions de Mac OS X v10.7. Ce n'est pas le cas avec les révisions de Mac OS X v10.8 ou supérieur. Au lieu de cela, voir: stackoverflow.com/a/4567308/543738
LS
3

Ouvrez simplement le ~/.profilefichier, via nanodans Terminal et tapez ici:

export PATH=whatever/you/want:$PATH

Enregistrez ce fichier (cmd + X et Y). Après cela, veuillez vous déconnecter / vous reconnecter ou simplement ouvrir un nouvel onglet dans Terminal et essayez d'utiliser votre nouvelle variable.

VEUILLEZ NE PAS oublier d'ajouter ": $ PATH" après ce que / vous / voulez, sinon vous effacerez tous les chemins de la variable PATH, qui étaient là avant cela.

Migele
la source
4
Cela s'applique uniquement à l'environnement de commande bash. Les variables que vous définissez ici ne sont pas vues par les applications GUI.
Warren P
3

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

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

Ersin Er
la source
C'est fantastique. Suggestion: Mettez le truc "refresh now" de launchctl unload / launctl load dans un script. Je l'ai appelé osx-env-sync-now.sh. Je modifie mon .bash_profile et lance le petit script "Actualiser maintenant" et continue. Je pense qu'il y a des implications en matière de sécurité ici, alors je pense que certaines limites devraient être apportées. Il doit y avoir des raisons pour lesquelles ils ont désactivé cette fonctionnalité dans OS X.
Warren P
@WarrenP terminé! Vérifiez le repo.
Ersin Er
Excellent. Cela a résolu beaucoup de douleur pour moi. Un cas où cela est vraiment utile est pour quiconque développe avec SCALA. Définir SCALA_HOME à la fois pour la ligne de commande scala et GUI scala (comme dans netbeans) est une vraie douleur autrement.
Warren P
0

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

IgorGanapolsky
la source
Cela ne fonctionne pas pour moi. J'ai /usr/bin/localdans ce fichier, même sans modifier le fichier, c'était comme ça par défaut, et pourtant mes applications GUI ne voient que /usr/bin:/bin:/usr/sbin:/sbin. J'ai redémarré plusieurs fois.
mgol
@m_gol Qu'est-ce que vous obtenez lorsque vous courez cat /etc/paths/?
IgorGanapolsky
1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, sur des lignes séparées. Et pourtant SourceTree les voit tous sauf le premier.
mgol
Vous voudrez peut-être modifier en "Si vous souhaitez modifier le chemin par défaut dans macOS". Cela n'a rien à voir avec le problème plus général des variables d'environnement.
rfay
0

Pour les utilisateurs de Mac OS X Catalina 2020:

Oubliez les autres réponses inutiles, voici seulement deux étapes nécessaires:

  1. Créez un fichier avec la convention de dénomination: priority-appname. Ensuite, copiez-collez le chemin que vous souhaitez ajouter PATH.

    Par exemple 80-vscodeavec le contenu /Applications/Visual Studio Code.app/Contents/Resources/app/bin/dans mon cas.

  2. Déplacez ce fichier vers /etc/paths.d/. N'oubliez pas d'ouvrir un nouvel onglet (nouvelle session) dans le Terminal et tapez echo $PATHpour vérifier que votre chemin est ajouté!

Remarque: cette méthode ajoute uniquement votre chemin PATH.

Il pleut
la source