Pregunta Establecer variables de entorno en OS X?


¿Cuál es la forma correcta de modificar variables de entorno como PATH en OSX? He buscado un poco en Google y encontré 3 archivos diferentes para editar:

  • / etc / paths
  • ~ / .profile
  • ~ / .tcshrc

Ni siquiera tengo algunos de estos archivos, y estoy bastante seguro de que .tcshrc está mal, ya que OSX usa bash ahora. ¿Alguien tiene alguna idea de dónde se definen estas variables, especialmente PATH?

Editar: estoy ejecutando OS X 10.5


773
2017-09-25 20:06


origen


Respuestas:


Bruno está bien encaminado. He realizado una investigación exhaustiva y si desea establecer variables que están disponibles en todas las aplicaciones de GUI, su única opción es /etc/launchd.conf

Tenga en cuenta que environment.plist no funciona para aplicaciones iniciadas a través de Spotlight. Esto está documentado por Steve Sexton aquí.

1) Abra un mensaje de terminal

2) Tipo sudo vi /etc/launchd.conf (nota: este archivo podría no existir aún)

3) Ponga contenidos como los siguientes en el archivo

# 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) Guarde sus cambios en VI y reinicie su Mac. O use el comando grep / xargs que se muestra en el comentario del código anterior.

5) Demuestre que sus variables funcionan, abriendo una ventana de Terminal y escribiendo export y deberías ver tus nuevas variables. Estos también estarán disponibles en IntelliJ y otras aplicaciones GUI que ejecute a través de Spotlight.


603
2018-02-25 23:42



Cómo configurar el entorno para nuevos procesos iniciado por Spotlight (sin necesidad de reiniciar)

Puede configurar el entorno utilizado por launchd (y, por extensión, cualquier cosa iniciada desde Spotlight) con launchctl setenv. Por ejemplo, para establecer la ruta:

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

O si quieres establecer tu camino en .bashrc o similar, luego haz que se refleje en launchd:

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

No hay necesidad de reiniciar aunque tendrá que reiniciar una aplicación si desea que recoja el entorno modificado.

Esto incluye cualquier caparazón que ya se ejecute en Terminal.app, aunque si estás allí puedes configurar el entorno más directamente, p. con export PATH=/opt/local/bin:/opt/local/sbin:$PATH para bash o zsh.

Cómo mantener los cambios después de un reinicio

A mantener los cambios después de un reinicio puedes configurar las variables de entorno desde /etc/launchd.conf, al igual que:

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

launchd.conf se ejecuta automáticamente cuando reinicias.

Si desea que estos cambios surtan efecto ahora, debe usar este comando para reprocesar launchctl.conf (gracias @mklement por la propina!)

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

Puede encontrar más información sobre launchctl y cómo se carga launchd.conf con el comando man launchctl.


241
2017-09-21 01:23



Hasta e incluido León (10.7) puede configurarlos en

~ / .MacOSX / environment.plist

Ver:

Para PATH en la Terminal, deberías poder establecer .bash_profile o .profile (probablemente tendrás que crearlo)

Para el león de montaña y más allá  necesitas usar launchd y launchctl


102
2017-09-25 20:08



Solución para aplicaciones de línea de comando y GUI desde una única fuente (funciona con Yosemite y El Capitan)

Supongamos que tiene definiciones de variables de entorno en su ~/.bash_profile como en el siguiente fragmento:

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"

Necesitamos una Agente de lanzamiento que se ejecutará en cada inicio de sesión y en cualquier momento bajo demanda que va a cargar estas variables a la sesión del usuario. También necesitaremos un script de shell para analizar estas definiciones y crear los comandos necesarios para que el agente los ejecute.

Crea un archivo con plist sufijo (por ejemplo, nombrado osx-env-sync.plist) en ~/Library/LaunchAgents/ directorio con los siguientes contenidos:

<?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 el parámetro es crítico aquí; es necesario para ejecutar el script de shell con un iniciar sesión shell así que eso ~/.bash_profile se origina en primer lugar antes de que se ejecute este script.

Ahora, el script de shell. Créalo en ~/.osx-env-sync.sh con los siguientes contenidos:

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

Asegúrese de que el script de shell sea ejecutable:

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

Ahora, cargue el agente de lanzamiento para la sesión actual:

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

(Re) Inicie una aplicación GUI y verifique que pueda leer las variables de entorno.

La configuración es persistente. Sobrevivirá a reinicios y relogines.

Después de la configuración inicial (que acaba de hacer), si desea reflejar cualquier cambio en su ~/.bash_profile a todo tu entorno nuevamente, volviendo a ejecutar el launchctl load ... el comando no realizará lo que quieras; en su lugar, recibirá una advertencia como la siguiente:

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

Para volver a cargar las variables de entorno sin pasar por el proceso de cierre de sesión / inicio de sesión, haga lo siguiente:

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

Finalmente, asegúrese de reiniciar las aplicaciones que ya está ejecutando (incluida Terminal.app) para informarlas sobre los cambios.

También introduje el código y las explicaciones aquí en un proyecto de GitHub: osx-env-sync.

Espero que esta sea la solución definitiva, al menos para las últimas versiones de OS X (Yosemite y El Capitán).


56
2017-09-04 20:06



1.

vim ~/.bash_profile

El archivo puede no existir (si no, puedes simplemente crearlo).

2. Escribe esto y guarda el archivo:

export PATH=$PATH:YOUR_PATH_HERE

3.run

source ~/.bash_profile

46
2017-11-25 04:29



Hay esencialmente dos problemas para resolver cuando se trata de variables de entorno en OS X. La primera es cuando se invocan programas de Spotlight (el icono de la lupa en el lado derecho de la Mac menú / barra de estado) y el segundo al invocar programas desde el Dock. La invocación de programas desde una aplicación / utilidad de Terminal es trivial porque lee el entorno de las ubicaciones de shell estándar (~/.profile, ~/.bash_profile, ~/.bashrc, etc.)

Cuando invoque programas desde el Dock, use ~/.MacOSX/environment.plist donde el <dict> elemento contiene una secuencia de <key>KEY</key><string>theValue</string> elementos.

Al invocar programas de Spotlight, asegúrese de que launchd haya sido configuración con todas las configuraciones de clave / valor que necesita.

Para resolver ambos problemas simultáneamente, utilizo un elemento de inicio de sesión (establecido a través del Herramienta de preferencias del sistema) en mi cuenta de usuario. El elemento de inicio de sesión es un script bash que invoca una función de ceceo de Emacs, aunque uno puede, por supuesto, usar su herramienta de scripting favorita para lograr lo mismo. Este enfoque tiene el beneficio adicional de que funciona en cualquier momento y no requiere una reiniciar, es decir, uno puede editar ~/.profile, ejecute el elemento de inicio de sesión en algún shell y tenga los cambios visibles para los programas recién invocados, ya sea desde el Dock o Spotlight.

Detalles:

Elemento de inicio de sesión: ~/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"

Función Emacs lisp: ~/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)))

NOTA: Esta solución es una amalgama de los que vienen antes de que yo agregara la mía, particularmente la ofrecida por Matt Curtis, pero deliberadamente he intentado mantener mi ~/.bash_profile plataforma de contenido independiente y poner el ajuste de la launchd entorno (una instalación única de Mac) en un script separado.


33
2018-03-26 20:03



Otra solución gratuita, opensource, Mac OSX Mountain Lion (10.8) Panel de preferencia / environment.plist es EnvPane.

EnvPane's código fuente disponible en Github. EnvPane parece que tiene características comparables a RCEnvironmentSin embargo, parece que puede actualizar sus variables almacenadas al instante, es decir sin la necesidad de reiniciar o iniciar sesión, lo cual es bienvenido.

Según lo indicado por el desarrollador:

EnvPane es un panel de preferencias para Mac OS X 10.8 (Mountain Lion) que   le permite establecer variables de entorno para todos los programas en ambos gráficos   y sesiones terminales No solo restaura el soporte para   ~ / .MacOSX / environment.plist en Mountain Lion, también publica su   cambios en el entorno de inmediato, sin la necesidad de desconectarse   y de nuevo adentro.
  <SNIP>
  EnvPane incluye (e instala automáticamente) una   launchd agente que se ejecuta 1) temprano después del inicio de sesión y 2) siempre que   ~ / .MacOSX / environment.plist cambia. El agente lee   ~ / .MacOSX / environment.plist y exporta las variables de entorno de   ese archivo a la instancia de inicio del usuario actual a través de la misma API que   es utilizado por launchctl setenv y launchctl unsetenv.

Descargo de responsabilidad: no estoy relacionado con el desarrollador o su proyecto.

PD Me gusta el nombre (suena como 'Finaliza dolor').


21
2018-01-15 14:04



En Mountain Lion todo el /etc/paths y /etc/launchd.conf la edición no tiene ningún efecto!

Los foros de desarrolladores de Apple dicen:

"Cambie el Info.plist del .app mismo para contener un" LSEnvironment "   diccionario con las variables de entorno que desee.

~ / .MacOSX / environment.plist ya no es compatible. "

Así que edité directamente la aplicación Info.plist (haga clic derecho en "AppName.app" (en este caso SourceTree) y luego "Show package contents")

Show Package Contents

y agregó un nuevo par clave / dict llamado:

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

(ver: LaunchServicesKeys Documentation at Apple)

enter image description here

ahora la aplicación (en mi caso SourceTree) usa la ruta dada y funciona con git 1.9.3 :-)

PD: por supuesto, tiene que ajustar la entrada de ruta a sus necesidades específicas de ruta.


17
2018-01-24 12:30



Si bien las respuestas aquí no son "incorrectas", agregaré otra: nunca realice cambios en las variables de entorno en OS X que afecten "todos los procesos", o incluso, fuera del intérprete de comandos, para todos los procesos ejecutados interactivamente por un usuario determinado.

En mi experiencia, los cambios globales en variables de entorno como PATH para todos los procesos tienen incluso más probabilidades de romper cosas en OS X que en Windows. Por esta razón, muchas aplicaciones OS X y otro software (incluidos, tal vez especialmente, los componentes del sistema operativo) confían en las herramientas de línea de comandos de UNIX y asumen el comportamiento de las versiones de estas herramientas proporcionadas con el sistema, y no necesariamente utiliza rutas absolutas al hacerlo (los comentarios similares se aplican a bibliotecas cargadas dinámicamente y variables de entorno DYLD_ *). Considere, por ejemplo, que las respuestas mejor calificadas para varias preguntas sobre el Desbordamiento de pila sobre cómo reemplazar las versiones de intérpretes provistas por OS X, como Python y Ruby, generalmente dicen "no hagas esto".

OS X no es realmente diferente a otros sistemas operativos tipo UNIX (por ejemplo, Linux, FreeBSD y Solaris) en este aspecto; la razón más probable por la que Apple no proporciona una manera fácil de hacerlo es porque rompe cosas. En la medida en que Windows no es tan propenso a estos problemas, se debe a dos cosas: (1) el software de Windows no tiende a depender de las herramientas de línea de comandos en la medida en que el software UNIX lo hace, y (2) Microsoft ha tenido un historial tan extenso de "DLL hell" y problemas de seguridad causados ​​por cambios que afectan a todos los procesos que han cambiado el comportamiento de la carga dinámica en las versiones más recientes de Windows para limitar el impacto de las opciones de configuración "globales" como PATH.

"Lame" o no, tendrás un sistema mucho más estable si restringes esos cambios a ámbitos más pequeños.


16
2017-07-17 01:46



A veces, todas las respuestas anteriores simplemente no funcionan. Si desea tener acceso a una variable del sistema (como M2_HOME) en Eclipse o en IntelliJ, lo único que funciona para mí en este caso es:

Primero (paso 1) edite /etc/launchd.conf para contener una línea como esta: "setenv VAR value" y luego (paso 2) reiniciar.

La simple modificación de .bash_profile no funcionará porque en OSX las aplicaciones no se inician como en otros UNIX, no heredan las variables de shell de los padres. Todas las demás modificaciones no funcionarán por una razón que desconozco. Tal vez alguien más pueda aclarar sobre esto.


15
2018-01-16 12:12



Después de perseguir el Panel de preferencias Variables de entorno y al descubrir que el enlace está roto y una búsqueda en el sitio de Apple parece indicar que se han olvidado de él ... Comencé a seguir el camino del elusivo proceso de lanzamiento.

En mi sistema (Mac OS X 10.6.8) parece que las variables definidas en environment.plist son exportarse de manera confiable a aplicaciones lanzadas desde Spotlight (a través de launchd). Mi problema es que esos vars no se están exportando a nuevas sesiones bash en Terminal. Es decir. Tengo el problema opuesto como se muestra aquí.

NOTA: environment.plist se parece a JSON, no XML, como se describió anteriormente

Pude obtener aplicaciones de Spotlight para ver los vars por edición ~ / MacOSX / environment.plist  y Pude forzar los mismos vars a una nueva sesión de Terminal agregando lo siguiente a mi archivo .profile:

eval $(launchctl export)

13
2017-07-06 23:59