variable update sierra permanently mac high define create bash_profile environment-variables osx-yosemite osx-elcapitan

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 ejecutar launchctl limit como root temprano durante el arranque, quizás desde un LaunchDaemon . (...)

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:

  1. El único lugar para declarar las variables de entorno del sistema: / etc / environment
  2. 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 SettingsUsuarios y gruposElementos 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 .