Configuración de variables de entorno en OS X

Resuelto Paul Wicks asked hace 16 años • 0 respuestas

¿Cuál es la forma correcta de modificar variables de entorno como PATH en OS X?

Busqué un poco en Google y encontré tres archivos diferentes para editar:

  • /etc/rutas
  • ~/.perfil
  • ~/.tcshrc

Ni siquiera tengo algunos de estos archivos y estoy bastante seguro de que .tcshrc es incorrecto, ya que OS X ahora usa bash. ¿Dónde se definen estas variables, especialmente PATH?

Estoy ejecutando OS X v10.5 (Leopard).

Paul Wicks avatar Sep 26 '08 03:09 Paul Wicks
Aceptado

Bruno va por buen camino. He investigado exhaustivamente y si desea configurar variables que están disponibles en todas las aplicaciones 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. Abrir un mensaje de terminal

  2. Escriba sudo vi /etc/launchd.conf(nota: es posible que este archivo aún no exista)

  3. Coloque contenidos como el siguiente 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 environment 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 utilice el comando grep/ xargsque se muestra en el comentario del código anterior.

  5. Demuestre que sus variables están funcionando abriendo una ventana de Terminal y escribiendo exporty debería ver sus nuevas variables. Estos también estarán disponibles en IntelliJ IDEA y otras aplicaciones GUI que inicie a través de Spotlight.

Matthew McCullough avatar Feb 25 '2009 23:02 Matthew McCullough

No espere que ~/.launchd.conf funcione

La página de manual de launchctl dice que nunca funcionó:

FUNCIONALIDAD DESPRECADA Y ELIMINADA

launchctl ya no tiene un modo interactivo ni acepta comandos de stdin. El archivo /etc/launchd.conf ya no se consulta para ejecutar subcomandos durante el inicio temprano; esta funcionalidad se eliminó por consideraciones de seguridad. Si bien estaba documentado que se consultaría $HOME/.launchd.conf antes de configurar la sesión de un usuario, esta funcionalidad nunca se implementó.

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

Puedes 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 desea configurar su ruta en .bashrco similar, reflejela en launchd:

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

No es necesario reiniciar, aunque deberá reiniciar una aplicación si desea que retome el entorno modificado.

Esto incluye cualquier shell que ya se esté ejecutando en Terminal.app, aunque si estás allí puedes configurar el entorno más directamente, por ejemplo, con export PATH=/opt/local/bin:/opt/local/sbin:$PATHbash o zsh.

Cómo mantener los cambios después de reiniciar

Nuevo método (desde 10.10 Yosemite)

Usar launchctl config user path /bin:/usr/bin:/mystuff. Consulte man launchctlpara obtener más información.

Método anterior

La cita de la página de manual de launchctl en la parte superior de esta respuesta dice que la función descrita aquí (lectura /etc/launchd.confen el arranque) se eliminó por razones de seguridad, por lo que ymmv.

Para mantener los cambios después de reiniciar, puede configurar las variables de entorno desde /etc/launchd.conf, así:

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

launchd.confse ejecuta automáticamente cuando reinicia.

Si desea que estos cambios surtan efecto ahora, debe usar este comando para reprocesar launchd.conf(¡gracias @mklement por el consejo!)

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

Puede obtener más información sobre launchctlcómo se carga launchd.confcon el comando man launchctl.

Matt Curtis avatar Sep 21 '2010 01:09 Matt Curtis

Hasta OS X v10.7 (Lion) inclusive , puede configurarlos en:

~/.MacOSX/environment.plist

Ver:

  • https://developer.apple.com/legacy/library/qa/qa1067/_index.html
  • https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/EnvironmentVars.html

Para PATH en la Terminal, deberías poder configurar .bash_profileo .profile(aunque probablemente tendrás que crearlo)

Para OS X v10.8 (Mountain Lion) y versiones posteriores, debe utilizar launchdylaunchctl .

tim_yates avatar Sep 25 '2008 20:09 tim_yates

Solución para aplicaciones de línea de comandos y GUI desde una única fuente (funciona con Mac OS X v10.10 (Yosemite) y Mac OS X v10.11 (El Capitan))

Supongamos que tiene definiciones de variables de entorno ~/.bash_profilesimilares 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 un Agente de lanzamiento que se ejecutará en cada inicio de sesión y en cualquier momento bajo demanda y que cargará estas variables en la sesión del usuario. También necesitaremos un script de shell para analizar estas definiciones y crear los comandos necesarios para que los ejecute el agente.

Cree un archivo con plistsufijo (por ejemplo, llamado osx-env-sync.plist) en el ~/Library/LaunchAgents/directorio con el siguiente contenido:

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

-lEl parámetro es crítico aquí; es necesario para ejecutar el script de shell con un shell de inicio de sesión , de modo que ~/.bash_profilese obtenga en primer lugar antes de ejecutar este script.

Ahora, el script de shell. Créelo en ~/.osx-env-sync.shcon el siguiente contenido:

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 nuevos inicios de sesión.

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

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

Para recargar sus 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 se están ejecutando (incluido Terminal.app) para informarles de los cambios.

También envié el código y las explicaciones aquí a 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 Capitan).

Ersin Er avatar Sep 04 '2015 20:09 Ersin Er
  1. Hacer:

    vim ~/.bash_profile
    

    Es posible que el archivo no exista (si no, simplemente puede crearlo).

  2. Escribe esto y guarda el archivo:

    export PATH=$PATH:YOUR_PATH_HERE
    
  3. Correr

    source ~/.bash_profile
    
WoooHaaaa avatar Nov 25 '2011 04:11 WoooHaaaa