Question Définition des variables d'environnement sous OS X?


Quelle est la bonne façon de modifier les variables d'environnement comme PATH dans OSX? J'ai regardé un peu sur Google et trouvé 3 fichiers différents à éditer:

  • / etc / chemins
  • ~ / .profile
  • ~ / .tcshrc

Je n'ai même pas certains de ces fichiers, et je suis assez sûr que .tcshrc est faux, puisque OSX utilise maintenant bash. Quelqu'un a-t-il une idée de l'endroit où ces variables, en particulier PATH, sont définies?

Edit: Je cours OS X 10.5


773
2017-09-25 20:06


origine


Réponses:


Bruno est sur la bonne voie. J'ai fait des recherches approfondies et si vous voulez définir des variables qui sont disponibles dans toutes les applications graphiques, votre seule option est /etc/launchd.conf

Veuillez noter que environment.plist ne fonctionne pas pour les applications lancées via Spotlight. Ceci est documenté par Steve Sexton ici.

1) Ouvrez une invite de terminal

2) Type sudo vi /etc/launchd.conf (note: ce fichier n'existe peut-être pas encore)

3) Mettez le contenu comme suit dans le fichier

# Set environment variables here so they are available globally to all apps
# (and Terminal), including those launched via Spotlight.
#
# After editing this file run the following command from the terminal to update 
# environment variables globally without needing to reboot.
# NOTE: You will still need to restart the relevant application (including 
# Terminal) to pick up the changes!
# grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
#
# See http://www.digitaledgesw.com/node/31
# and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
#
# Note that you must hardcode the paths below, don't use enviroment variables.
# You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
#
setenv JAVA_VERSION 1.6
setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
setenv GROOVY_HOME /Applications/Dev/groovy
setenv GRAILS_HOME /Applications/Dev/grails
setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
setenv JRUBY_HOME /Applications/Dev/jruby

setenv ANT_HOME /Applications/Dev/apache-ant
setenv ANT_OPTS -Xmx512M

setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
setenv M2_HOME /Applications/Dev/apache-maven

setenv JMETER_HOME /Applications/Dev/jakarta-jmeter

4) Sauvegardez vos modifications dans VI et redémarrez votre Mac. Ou utilisez la commande grep / xargs qui est montrée dans le commentaire de code ci-dessus.

5) Démontrez que vos variables fonctionnent en ouvrant une fenêtre Terminal et en tapant export et vous devriez voir vos nouvelles variables. Ceux-ci seront également disponibles dans IntelliJ et d'autres applications GUI que vous lancez via Spotlight.


603
2018-02-25 23:42



Comment définir l'environnement pour les nouveaux processus lancés par Spotlight (sans avoir besoin de redémarrer)

Vous pouvez définir l'environnement utilisé par launchd (et, par extension, tout élément démarré à partir de Spotlight) avec launchctl setenv. Par exemple pour définir le chemin:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Ou si vous voulez configurer votre chemin dans .bashrc ou similaire, alors l'avoir mis en miroir dans launchd:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Il n'y a pas besoin de redémarrer Cependant, vous devrez redémarrer une application si vous voulez qu'elle prenne en charge l'environnement modifié.

Cela inclut tous les shells déjà en cours d'exécution sous Terminal.app, bien que si vous êtes là, vous pouvez définir l'environnement plus directement, par exemple. avec export PATH=/opt/local/bin:/opt/local/sbin:$PATH pour bash ou zsh.

Comment conserver les modifications après un redémarrage

À conserver les modifications après un redémarrage vous pouvez définir les variables d'environnement à partir de /etc/launchd.conf, ainsi:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf est exécuté automatiquement lorsque vous redémarrez.

Si vous souhaitez que ces modifications prennent effet maintenant, vous devez utiliser cette commande pour retraiter launchctl.conf (merci @mklement pour le pourboire!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Vous pouvez en savoir plus sur launchctl et comment ça se charge launchd.conf avec la commande man launchctl.


241
2017-09-21 01:23



Jusqu'au Lion inclus (10.7) vous pouvez les définir dans

~ / .MacOSX / environment.plist

Voir:

Pour PATH dans le Terminal, vous devriez être en mesure de mettre en .bash_profile ou .profile (vous devrez probablement le créer si)

Pour le lion de montagne et au-delà  vous devez utiliser launchd et launchctl


102
2017-09-25 20:08



Solution pour les applications de ligne de commande et d'interface graphique à partir d'une source unique (fonctionne avec Yosemite & El Capitan)

Supposons que vous avez des définitions de variable d'environnement dans votre ~/.bash_profile comme dans l'extrait suivant:

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

Nous avons besoin d'un Agent de lancement qui se déroulera à chaque connexion et à tout moment sur demande qui va charger ces variables à la session de l'utilisateur. Nous aurons également besoin d'un script shell pour analyser ces définitions et construire les commandes nécessaires à exécuter par l'agent.

Créer un fichier avec plist suffixe (par exemple nommé osx-env-sync.plist) dans ~/Library/LaunchAgents/ répertoire avec le contenu suivant:

<?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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-l le paramètre est critique ici; il est nécessaire d'exécuter le script shell avec un shell de connexion pour que ~/.bash_profile est originaire en premier lieu avant que ce script ne soit exécuté.

Maintenant, le script shell. Créez-le à ~/.osx-env-sync.sh avec le contenu suivant:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

Assurez-vous que le script shell est exécutable:

chmod +x ~/.osx-env-sync.sh

Maintenant, chargez l'agent de lancement pour la session en cours:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Re) Lancer une application graphique et vérifier qu'elle peut lire les variables d'environnement.

L'installation est persistante. Il survivra aux redémarrages et aux relogins.

Après la configuration initiale (que vous venez de faire), si vous voulez refléter les changements dans votre ~/.bash_profile à tout votre environnement, réexécuter le launchctl load ... la commande n'exécutera pas ce que vous voulez; à la place, vous recevrez un avertissement comme celui-ci:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

Pour recharger vos variables d'environnement sans passer par le processus de déconnexion / connexion, procédez comme suit:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

Enfin, assurez-vous de relancer vos applications en cours d'exécution (y compris Terminal.app) pour les informer des modifications.

J'ai également poussé le code et les explications ici vers un projet GitHub: osx-env-sync.

J'espère que ce sera la solution ultime, au moins pour les dernières versions d'OS X (Yosemite & El Capitan).


56
2017-09-04 20:06



1.

vim ~/.bash_profile

Le fichier peut ne pas exister (sinon, vous pouvez simplement le créer).

2. Tapez ceci et enregistrez le fichier:

export PATH=$PATH:YOUR_PATH_HERE

3.run

source ~/.bash_profile

46
2017-11-25 04:29



Il y a essentiellement deux problèmes à résoudre en traitant variables d'environnement dans OS X. Le premier est lors de l'invocation de programmes de Spotlight (l'icône en forme de loupe sur le côté droit du Mac menu / barre d'état) et la seconde lors de l'appel de programmes à partir du Dock. L'appel de programmes à partir d'une application / d'un utilitaire Terminal est trivial car il lit l'environnement à partir des emplacements de coque standard (~/.profile, ~/.bash_profile, ~/.bashrc, etc.)

Lorsque vous appelez des programmes du Dock, utilisez ~/.MacOSX/environment.plist où le <dict> élément contient une séquence de <key>KEY</key><string>theValue</string> éléments.

Lorsque vous appelez des programmes de Spotlight, assurez-vous que launchd a été configuration avec tous les paramètres de clé / valeur dont vous avez besoin.

Pour résoudre les deux problèmes simultanément, j'utilise un élément de connexion (défini via le Préférences système) sur mon compte utilisateur. L'élément de connexion est un script bash invoque une fonction Lisp Emacs bien que l'on peut bien sûr utiliser leur outil de script favori pour accomplir la même chose. Cette approche a l'avantage supplémentaire que cela fonctionne à tout moment et ne nécessite pas redémarrer, c'est-à-dire que l'on peut éditer ~/.profile, exécutez l'élément de connexion dans un shell et affichez les modifications pour les programmes récemment appelés, depuis le Dock ou Spotlight.

Détails:

Elément de connexion: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Fonction Lisp Emacs: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

NOTE: Cette solution est un amalgame de ceux qui viennent avant que j'ajoute le mien, en particulier celui offert par Matt Curtis, mais j'ai délibérément essayé de garder mon ~/.bash_profile plate-forme de contenu indépendant et mettre le réglage de la launchd environnement (une installation Mac seulement) dans un script séparé.


33
2018-03-26 20:03



Une autre solution OpenSpace, Mac OSX Mountain Lion (10.8), gratuite, opensource / environment.plist est EnvPane.

EnvPane's code source Disponible sur Github. EnvPane semble avoir des caractéristiques comparables à RCEnvironmentCependant, il semble qu'il peut mettre à jour ses variables stockées instantanément, c'est-à-dire sans pour autant le besoin d'un redémarrage ou d'une connexion, ce qui est le bienvenu.

Comme indiqué par le développeur:

EnvPane est un volet de préférences pour Mac OS X 10.8 (Mountain Lion)   vous permet de définir des variables d'environnement pour tous les programmes dans les deux graphiques   et des sessions terminales. Non seulement cela rétablit le support pour   ~ / .MacOSX / environment.plist dans Mountain Lion, il publie aussi votre   changements à l'environnement immédiatement, sans avoir besoin de se déconnecter   et de retour
  <SNIP>
  EnvPane comprend (et installe automatiquement) un   agent launchd qui s'exécute 1) tôt après la connexion et 2) chaque fois que le   ~ / .MacOSX / environment.plist change. L'agent lit   ~ / .MacOSX / environment.plist et exporte les variables d'environnement à partir de   ce fichier à l'instance de lancement de l'utilisateur actuel via la même API   est utilisé par launchctl setenv et launchctl unsetenv.

Avertissement: Je ne suis en aucun cas lié au développeur ou à son projet.

P.S. J'aime le nom (ça sonne comme 'Finit la douleur').


21
2018-01-15 14:04



Sur Mountain Lion tous les /etc/paths et /etc/launchd.conf l'édition ne prend aucun effet!

Les forums des développeurs d'Apple disent:

"Modifier l'Info.plist du .app lui-même pour contenir un" LSEnvironment "   dictionnaire avec les variables d'environnement que vous voulez.

~ / .MacOSX / environment.plist n'est plus supporté. "

J'ai donc directement modifié l'application Info.plist (faites un clic droit sur "AppName.app" (dans ce cas SourceTree) puis "Show package contents")

Show Package Contents

et ajouté une nouvelle paire clé / dict appelée:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(voir: LaunchServicesKeys Documentation chez Apple)

enter image description here

maintenant l'App (dans mon cas SourceTree) utilise le chemin donné et fonctionne avec git 1.9.3 :-)

PS: Bien sûr, vous devez ajuster l'entrée Path à vos besoins de chemin spécifiques.


17
2018-01-24 12:30



Alors que les réponses ici ne sont pas "fausses", j'en ajouterai une autre: ne jamais faire de changements de variable d'environnement dans OS X qui affectent "tous les processus", ou même, en dehors du shell, pour tous les processus exécutés interactivement par un utilisateur donné.

Dans mon expérience, les changements globaux aux variables d'environnement comme PATH pour tous les processus sont encore plus susceptibles de casser des choses sur OS X que sur Windows. Raison en être, beaucoup d'applications OS X et d'autres logiciels (y compris, peut-être surtout, les composants de l'OS lui-même) s'appuient sur les outils de ligne de commande UNIX et supposent le comportement des versions de ces outils fournis avec le système. n'utilisez pas nécessairement les chemins absolus (des commentaires similaires s'appliquent aux bibliothèques chargées dynamiquement et aux variables d'environnement DYLD_ *). Considérons, par exemple, que les réponses les mieux notées aux diverses questions Stack Overflow sur le remplacement des versions d'interprètes fournies par OS X, comme Python et Ruby, indiquent généralement «ne faites pas ceci».

OS X n'est vraiment pas différent des autres systèmes d'exploitation de type UNIX (par exemple, Linux, FreeBSD et Solaris) à cet égard; la raison la plus probable que Apple ne fournit pas un moyen facile de le faire est parce qu'il casse les choses. Dans la mesure où Windows n'est pas aussi vulnérable à ces problèmes, cela est dû à deux choses: (1) le logiciel Windows n'a pas tendance à s'appuyer sur les outils de ligne de commande comme le fait UNIX, et (2) Microsoft a eu un tel historique de "DLL enfer" et des problèmes de sécurité causés par des changements qui affectent tous les processus qu'ils ont changé le comportement du chargement dynamique dans les versions plus récentes de Windows pour limiter l'impact des options de configuration "globales" comme PATH.

"Lame" ou pas, vous aurez un système beaucoup plus stable si vous restreignez ces changements à des portées plus petites.


16
2017-07-17 01:46



Parfois, toutes les réponses précédentes ne fonctionnent tout simplement pas. Si vous voulez avoir accès à une variable système (comme M2_HOME) dans Eclipse ou dans IntelliJ, la seule chose qui fonctionne pour moi dans ce cas est:

D'abord (étape 1) éditez /etc/launchd.conf pour contenir une ligne comme ceci: "setenv VAR value" puis (étape 2) reboot.

Modifier simplement .bash_profile ne fonctionnera pas car dans osx, les applications ne sont pas démarrées comme dans les autres UNIX, elles n'héritent pas des variables shell des parents. Toutes les autres modifications ne fonctionneront pas pour une raison qui m'est inconnue. Peut-être que quelqu'un d'autre peut clarifier à ce sujet.


15
2018-01-16 12:12



Après avoir chassé le Volet de préférence Variables d'environnement et découvrant que le lien est cassé et une recherche sur le site d'Apple semble indiquer qu'ils l'ont oublié ... Je suis reparti sur la piste du processus de lancement insaisissable.

Sur mon système (Mac OS X 10.6.8) il apparaît que les variables définies dans environment.plist sont être exporté de manière fiable vers des applications lancées à partir de Spotlight (via launchd). Mon problème est que ces vars ne sont pas exportés vers de nouvelles sessions bash dans Terminal. C'est à dire. J'ai le problème inverse comme représenté ici.

NOTE: environment.plist ressemble à JSON, pas XML, comme décrit précédemment

J'ai été en mesure d'obtenir des applications Spotlight pour voir les vars par édition ~ / MacOSX / environment.plist  et J'ai été en mesure de forcer les mêmes variables dans une nouvelle session Terminal en ajoutant ce qui suit à mon fichier .profile:

eval $(launchctl export)

13
2017-07-06 23:59