¿Cómo se configuran las variables de entorno en Mac OS X de modo que estén disponibles para aplicaciones GUI sin usar ~ / .MacOSX / environment.plist o Login Hooks (ya que están en desuso )?
¿Cómo se configuran las variables de entorno en Mac OS X de modo que estén disponibles para aplicaciones GUI sin usar ~ / .MacOSX / environment.plist o Login Hooks (ya que están en desuso )?
Respuestas:
En Mountain Lion todo el /etc/paths
y /etc/launchd.conf
la edición no toma ningún efecto!
Los foros de desarrolladores de Apple dicen:
"Cambie el Info.plist del .app para que contenga un diccionario" LSEnvironment "con las variables de entorno que desee.
~ / .MacOSX / environment.plist ya no es compatible ".
Así que Info.plist
edité directamente la aplicación (haga clic derecho en "AppName.app" (en este caso, SourceTree) y luego " Show package contents
")
y agregó un nuevo par clave / dict llamado:
<key>LSEnvironment</key>
<dict>
<key>PATH</key>
<string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>
(ver: LaunchServicesKeys Documentation en Apple )
ahora la aplicación (en mi caso SourceTree) usa la ruta dada y funciona con git 1.9.3 :-)
PD: Por supuesto, debe ajustar la entrada de ruta a sus necesidades de ruta específicas.
Info.plist
surtieran efecto.
La solución utiliza la funcionalidad de launchctl
, combinada con un Agente de inicio para imitar los antiguos enlaces de inicio de sesión. Para otras soluciones que usan la tienda de launchd
, vea esta comparación . El agente de inicio utilizado aquí se encuentra en / Library / LaunchAgents / :
<?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>user.conf.launchd</string>
<key>Program</key>
<string>/Users/Shared/conflaunchd.sh</string>
<key>ProgramArguments</key>
<array>
<string>~/.conf.launchd</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>StandardIO</string>
</array>
</dict>
</plist>
Una cosa importante es la clave RunAtLoad para que el agente de inicio se ejecute lo antes posible. El verdadero trabajo se realiza en el script de shell /Users/Shared/conflaunchd.sh , que lee ~ / .conf.launchd y lo alimenta a launchctl
:
#! /bin/bash
#filename="$1"
filename="$HOME/.conf.launchd"
if [ ! -r "$filename" ]; then
exit
fi
eval $(/usr/libexec/path_helper -s)
while read line; do
# skip lines that only contain whitespace or a comment
if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi
eval launchctl $line
done <"$filename"
exit 0
Observe la llamada de path_helper
para configurar la RUTA correctamente. Finalmente, ~ / .conf.launchd se ve así
setenv PATH ~/Applications:"${PATH}"
setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:
# Locale
setenv LANG en_US.UTF-8
Estos son launchctl
comandos, consulte su página de manual para obtener más información. Funciona bien para mí (debo mencionar que todavía soy un chico Snow Leopard), las aplicaciones GUI como texstudio y TeXShop pueden ver mi propio árbol de tex. Cosas que se pueden mejorar:
El script de shell tiene un contenido #filename="$1"
. Esto no es accidental, ya que el agente de lanzamiento debe alimentar el nombre del archivo al script como argumento, pero eso no funciona.
Como se mencionó aquí (¡alemán y detrás de un muro de pago!), Es posible poner el script en el agente de lanzamiento.
No estoy seguro de cuán segura es esta solución, ya que se utiliza eval
con cadenas proporcionadas por el usuario.
Creo recordar que la definición de MANPATH usando este método no funcionó bien, pero no estoy seguro.
Cabe mencionar que Apple pretendía un enfoque algo similar al poner cosas en ∼ / launchd.conf , pero actualmente no es compatible con esta fecha y el sistema operativo (consulte la página de manual de launchd.conf
). Supongo que cosas como el globbing no funcionarían como lo hacen en esta propuesta. Y, por supuesto, uno puede colocar estos archivos en cualquier otro lugar, excepto el agente de inicio que debe residir en / Library / LaunchAgents / o ~ / Library / LaunchAgents / .
Finalmente, debo mencionar las fuentes que utilicé como información sobre los Agentes de lanzamiento: 1 , 2 , 3 , 4 .
Actualización : esto no funciona en la versión 10.8 por el momento. Las soluciones alternativas por aplicación se describen aquí y aquí .
export PATH=.:"$(launchctl getenv PATH)"
en ~ / .bash_profile (de manera similar para otros shells). Esto es posible ya que path_helper
se llama en el script de shell. Para obtener más detalles sobre la variable PATH en OS X, consulte esta respuesta .
La respuesta proporcionada por @flori funciona para mí en Maverick siempre que ejecute los siguientes comandos en la Terminal después de cambiar el archivo plist
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
La respuesta proporcionada por @ percival-ulysses me funciona en 10.9 Mavericks con el siguiente pequeño cambio: edite el script /Users/Shared/conflaunchd.sh justo antes exit 0
y agregue las líneas
killall Dock
killall SystemUIServer
para reiniciar el Dock y la barra de menú. Después de esto, las aplicaciones iniciadas desde el Dock o desde Spotlight heredarán la RUTA correcta. Si usa Finder para iniciar las aplicaciones críticas de RUTA, entonces también killall Finder
puede agregarse.
En el .bash_profile
uso la línea
export PATH=`launchctl getenv PATH`
para establecer la RUTA para la Terminal, de esta manera la RUTA se controla desde la misma ubicación, el archivo ~ / .conf.launchd .
Otra opción es usar /etc/launchd.conf
. Por ejemplo, he cambiado el valor predeterminado PATH
agregando esta línea a /etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
Puede aplicar los cambios /etc/launchd.conf
reiniciando o ejecutando, launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
finalizando y reiniciando procesos.
La configuración se /etc/launchd.conf
aplica tanto al proceso de lanzamiento raíz como a los procesos de lanzamiento por usuario. Las variables de entorno establecidas con setenv
in /etc/launchd.conf
se muestran con ambos sudo launchctl export
y launchctl export
.