Respuestas:
Crea un environment.plist
archivo ~/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 launchctl
comandos dentro del <string></string>
bloque.
Se plist
activará después de reiniciar el sistema. También puede usar launchctl load ~/Library/LaunchAgents/environment.plist
para iniciarlo de inmediato.
[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 del todo. Si la computadora se reinicia y se selecciona "Reabrir ventanas al volver a iniciar sesión", es posible que las ventanas reabiertas no vean las variables (tal vez se abran 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. Eso debe establecerse a través de 'launchctl config user path ...' y en / etc / paths.
UseSanitizedBuildSystemEnvironment
).
[ Respuesta original ]: aún puede usar launchctl setenv variablename value
para establecer una variable para que sea recogida por todas las aplicaciones (aplicaciones gráficas iniciadas 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"
(Use varias líneas si desea 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 evitar este lugar, todas las variables que desea definir en un script de shell corto, luego eche un vistazo a esta respuesta anterior sobre cómo ejecutar un script en el inicio de sesión de MacOS . De esa manera, el script se invocará cuando el usuario inicie sesión.
[ Editar ]: ninguna de las soluciones es perfecta ya que las variables solo se establecerán para ese usuario específico, pero espero / supongo que eso es todo lo que necesita.
Si tiene varios usuarios, puede configurar 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 Library / LaunchAgents , apuntando al mismo script de shell.
Por supuesto, ninguna de estas soluciones es tan conveniente como /etc/launchd.conf .
[ Edición adicional ]: 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 establece variables en el terminal a través de ~ / .profile o ~ / .bash_profile , anularán los elementos establecidos a través de launchctl setenv para las aplicaciones iniciadas desde el shell .
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 del 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 root:
$ 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:
Problemas / problemas:
Para que las aplicaciones envíen sus variables env correctamente después del reinicio del sistema , necesitará:
Esto sucede debido a que Apple niega el pedido explícito de los 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), por lo que no es un gran problema.
JAVA_HOME
), pero no para la PATH
variable (vea mi pregunta sobre preguntar diferente ).
launchd
, pero ¿no sería posible cargar esos Daemons en el arranque (es decir, antes de iniciar sesión)? Eso debería eludir todos los problemas que mencionas.
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
fue eliminado intencionalmente por razones de seguridad. Como solución alternativa, puede ejecutarlaunchctl limit
como root temprano durante el arranque, tal vez desde aLaunchDaemon
. (...)
Solución:
Poner 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
/Library/LaunchDaemons
, y en lugar de decirle launchctl
que ejecute el limit
comando, dígale que ejecute el setenv
comando con PATH
una cadena de ruta como argumentos. launchd
debería recogerlo automáticamente al inicio y obtener una especie de auto-modificación casi de inmediato.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Estos son los comandos para restaurar el comportamiento anterior:
# 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.
Lo que funcionó para mí (inspirado por aax 'gracias):
Pegue esto en /Library/LaunchDaemons/com.apple.launchd.limit.plist y 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:
⌘+v
). Esto forzará el límite a 16384 archivos por proceso y 16384 archivos en totalesc
luego:wq
espero que esto te ayude.
Puedes probar https://github.com/ersiner/osx-env-sync . Maneja tanto la línea de comandos como las aplicaciones GUI desde una sola fuente y funciona con la última versión de OS X (Yosemite).
Puede usar sustituciones de ruta y otros trucos de shell, ya que lo que escribe es un script bash regular que se obtiene de bash en primer lugar. Sin restricciones. (Consulte la documentación de osx-env-sync y comprenderá cómo lo logra).
Respondí una pregunta similar aquí donde encontrarás más.
La solución es agregar su variable a /etc/profile
. ¡Entonces todo funciona como se esperaba! Por supuesto, DEBE hacerlo como usuario root con sudo nano / etc / profile. Si lo edita de alguna otra manera, el sistema se quejará con un perfil / etc / dañado, incluso si cambia los permisos a root.
Agregué las variables en el ~ / .bash_profile de la siguiente manera. Una vez que haya terminado, 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