Configuración de variables de entorno en OS X
¿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).
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í .
Abrir un mensaje de terminal
Escriba
sudo vi /etc/launchd.conf
(nota: es posible que este archivo aún no exista)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
Guarde sus cambios en vi y reinicie su Mac. O utilice el comando
grep
/xargs
que se muestra en el comentario del código anterior.Demuestre que sus variables están funcionando abriendo una ventana de Terminal y escribiendo
export
y 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.
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 .bashrc
o 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:$PATH
bash 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 launchctl
para 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.conf
en 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.conf
se 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 launchctl
cómo se carga launchd.conf
con el comando man launchctl
.
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_profile
o .profile
(aunque probablemente tendrás que crearlo)
Para OS X v10.8 (Mountain Lion) y versiones posteriores, debe utilizar launchd
ylaunchctl
.
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_profile
similares 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 plist
sufijo (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>
-l
El 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_profile
se obtenga en primer lugar antes de ejecutar este script.
Ahora, el script de shell. Créelo en ~/.osx-env-sync.sh
con 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_profile
todo 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).
Hacer:
vim ~/.bash_profile
Es posible que el archivo no exista (si no, simplemente puede crearlo).
Escribe esto y guarda el archivo:
export PATH=$PATH:YOUR_PATH_HERE
Correr
source ~/.bash_profile