environment-variables - update - macos set environment variable permanently
Establecer variables de entorno a través de launchd.conf ya no funciona en OS X Yosemite/El Capitan/macOS Sierra? (9)
Parece que launchd.conf
ya no carga mi variable de entorno. Alguien más ha notado?
¿Hay alguna otra solución para establecer permanentemente las variables de entorno?
Agregué las variables en ~ / .bash_profile de la siguiente manera. Después de terminar, reinicie / cierre sesión e inicie sesión
export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3
export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4
launchctl setenv M2_HOME $M2_HOME
launchctl setenv ANT_HOME $ANT_HOME
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin
launchctl setenv PATH $PATH
NOTA: sin reiniciar / cerrar sesión e iniciar sesión, puede aplicar estos cambios usando;
source ~/.bash_profile
Aquí están los comandos para restaurar el viejo comportamiento:
# create a script that calls launchctl iterating through /etc/launchd.conf
echo ''#!/bin/sh
while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf;
'' > /usr/local/bin/launchd.conf.sh
# make it executable
chmod +x /usr/local/bin/launchd.conf.sh
# launch the script at startup
echo ''<?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>launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/usr/local/bin/launchd.conf.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
'' > /Library/LaunchAgents/launchd.conf.plist
Ahora puede especificar comandos como setenv JAVA_HOME /Library/Java/Home
en /etc/launchd.conf
.
Comprobado en El Capitan.
Citado de
Apple Developer Relations 10-Oct-2014 09:12 PM
Después de mucha deliberación, la ingeniería ha eliminado esta característica. El archivo
/etc/launchd.conf
se eliminó intencionalmente por razones de seguridad. Como solución alternativa, puede ejecutarlaunchctl limit
como root temprano durante el arranque, quizás desde unLaunchDaemon
. (...)
Solución:
Coloque el código en
/Library/LaunchDaemons/com.apple.launchd.limit.plist
por bash-script:
#!/bin/bash
echo ''<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>core</string>
<string>unlimited</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>'' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist
Cree un archivo environment.plist
en ~/Library/LaunchAgents/
con este 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>my.startup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>
launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
launchctl setenv PATH $PATH:/Applications/gradle/bin
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Puede agregar muchos comandos launchctl
dentro del bloque <string></string>
.
El plist
se activará después del reinicio del sistema. También puede usar launchctl load ~/Library/LaunchAgents/environment.plist
para iniciarlo inmediatamente.
[Editar]
La misma solución también funciona en El Capitán.
Xcode 7.0+ no evalúa las variables de entorno de forma predeterminada. El comportamiento anterior se puede habilitar con este comando:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Editar]
Hay un par de situaciones en las que esto no funciona. Si se reinicia la computadora y se vuelve a seleccionar "Volver a abrir Windows al iniciar sesión", las ventanas reabiertas pueden no ver las variables (quizás se abren antes de que se ejecute el agente). Además, si inicia sesión a través de ssh, las variables no se establecerán (por lo que deberá configurarlas en ~ / .bash_profile). Finalmente, esto no parece funcionar para PATH en El Capitan y Sierra. Esto debe establecerse a través de ''launchctl config user path ...'' y en / etc / paths.
Es posible establecer variables de entorno en Mac OS X 10.10 Yosemite con 3 archivos + 2 comandos.
Archivo principal con definición de variables de entorno:
$ ls -la /etc/environment
-r-xr-xr-x 1 root wheel 369 Oct 21 04:42 /etc/environment
$ cat /etc/environment
#!/bin/sh
set -e
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start"
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv MAVEN_HOME /opt/local/share/java/maven3
if [ -x /usr/libexec/path_helper ]; then
export PATH=""
eval `/usr/libexec/path_helper -s`
launchctl setenv PATH $PATH
fi
osascript -e ''tell app "Dock" to quit''
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete"
Definición de servicio para cargar variables de entorno para aplicaciones de usuario (terminal, IDE, ...):
$ ls -la /Library/LaunchAgents/environment.user.plist
-rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist
$ sudo cat /Library/LaunchAgents/environment.user.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>environment.user</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
La misma definición de servicio para aplicaciones de usuario raíz:
$ ls -la /Library/LaunchDaemons/environment.plist
-rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist
$ sudo cat /Library/LaunchDaemons/environment.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>environment</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
Y finalmente debemos registrar estos servicios:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
Lo que obtenemos:
- El único lugar para declarar las variables de entorno del sistema: / etc / environment
- Actualización automática instantánea de variables de entorno después de la modificación del archivo / etc / environment - simplemente reinicie su aplicación
Problemas / problemas:
Para que las aplicaciones aprueben correctamente las variables env después del reinicio del sistema , necesitarás:
- cualquiera de los dos inicios de sesión: login => logout => login
- o cerrar y volver a abrir las aplicaciones manualmente, donde se deben tomar las variables env
- o NO use la función "Reabrir ventanas al volver a iniciar sesión".
Esto sucede debido a que Apple niega el pedido explícito de servicios cargados, por lo que las variables env se registran en paralelo con el procesamiento de la "cola de reapertura".
Pero en realidad, reinicio mi sistema solo varias veces al año (en grandes actualizaciones), así que no es un gran problema.
La solución es agregar su variable a /etc/profile
. ¡Entonces todo funciona como se esperaba! Por supuesto, DEBES hacerlo como usuario root con sudo nano / etc / profile. Si lo edita de otra manera, el sistema se quejará con un perfil / etc / dañado, incluso si cambia los permisos a la raíz.
Lo que funcionó para mí (inspirado en las gracias de Aax):
Pegue esto en /Library/LaunchDaemons/com.apple.launchd.limit.plist luego reinicie:
<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>16384</string>
<string>16384</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Si lo necesitas paso a paso:
- Terminal de lanzamiento
- Escriba sudo su y luego ingrese su contraseña para iniciar sesión como root
- Escriba vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
- Cuando esté en el editor vi, presione la tecla i para ingresar al modo insertar y pegue el contenido exacto del código arriba (
⌘+v
). Esto forzará el límite a 16384 archivos por proceso y 16384 archivos en total - Guarde su archivo y salga usando
esc
entonces:wq
- Reinicia tu sistema y verifica que funcione con el comando launchctl limit
espero que esto te ayude.
Puede probar https://github.com/ersiner/osx-env-sync . Maneja tanto la línea de comando como las aplicaciones GUI desde una única fuente y funciona con la última versión de OS X (Yosemite).
Puedes usar sustituciones de ruta y otros trucos de shell ya que lo que escribes es un script bash regular que se origina en bash en primer lugar. Sin restricciones ... (Consulte la https://github.com/ersiner/osx-env-sync y comprenderá cómo lo consigue).
Respondí una pregunta similar here donde encontrarás más.
[ Respuesta original ]: aún puede usar launchctl setenv variablename value
para establecer una variable para que la launchctl setenv variablename value
todas las aplicaciones (las aplicaciones gráficas se iniciaron a través del Dock o Spotlight, además de las iniciadas a través del terminal).
Obviamente, no querrás hacer esto cada vez que inicies sesión.
[ Editar ]: para evitar esto, inicie AppleScript Editor
, ingrese un comando como este:
do shell script "launchctl setenv variablename value"
(Usa múltiples líneas si quieres establecer múltiples variables)
Ahora guarde ( ⌘
+ s
) como Formato de archivo: Aplicación . Finalmente, abra System Settings
→ Usuarios y grupos → Elementos de inicio de sesión y agregue su nueva aplicación.
[ Respuesta original ]: para trabajar alrededor de este lugar todas las variables que desea definir en un guión corto de shell, luego eche un vistazo a esta respuesta anterior sobre cómo ejecutar un script en el inicio de sesión de MacOS . De esta forma, el script se invocará cuando el usuario inicie sesión.
[ Editar ]: Ninguna de las dos soluciones es perfecta, ya que las variables solo se establecerán para ese usuario específico, pero estoy seguro de que puede ser todo lo que necesita.
Si tiene varios usuarios, puede establecer manualmente un elemento de inicio de sesión para cada uno de ellos o colocar una copia de com.user.loginscript.plist en cada uno de sus directorios locales de Library / LaunchAgents , apuntando al mismo script de shell.
Por supuesto, ninguna de estas soluciones alternativas es tan conveniente como /etc/launchd.conf .
[ Editar más ]: Un usuario a continuación menciona que esto no funcionó para él. Sin embargo, he probado en varias máquinas de Yosemite y funciona para mí. Si tiene un problema, recuerde que deberá reiniciar las aplicaciones para que esto surta efecto. Además, si configura las variables en el terminal a través de ~ / .profile o ~ / .bash_profile , anularán las cosas configuradas mediante launchctl setenv para las aplicaciones iniciadas desde el shell .