Establecer variables de entorno en OS X para aplicaciones GUI

18

¿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 )?

Percival Ulises
fuente
@ ersin-er La respuesta de StackOverflow "Solución para aplicaciones de línea de comandos y GUI de una sola fuente (funciona con Yosemite y El Capitan)" puede ser de interés para las personas que encuentran esta pregunta.
l --mar l l

Respuestas:

16

En Mountain Lion todo el /etc/pathsy /etc/launchd.confla 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.plistedité directamente la aplicación (haga clic derecho en "AppName.app" (en este caso, SourceTree) y luego " Show package contents")

Mostrar el contenido del paquete

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 )

ingrese la descripción de la imagen aquí

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.

Flori
fuente
1
¡Gracias! Esto fue perfecto para mi. El 10.11 (El Capitan) también tuve que ejecutar los comandos proporcionados por Matthew para ver que mis cambios Info.plistsurtieran efecto.
dsedivec
8

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_helperpara 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 launchctlcomandos, 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:

  1. 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.

  2. Como se mencionó aquí (¡alemán y detrás de un muro de pago!), Es posible poner el script en el agente de lanzamiento.

  3. No estoy seguro de cuán segura es esta solución, ya que se utiliza evalcon cadenas proporcionadas por el usuario.

  4. 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í .

Percival Ulises
fuente
Por cierto, si uno quiere definir la variable de RUTA en un entorno de Terminal y usa este agente de lanzamiento, sugiero escribir export PATH=.:"$(launchctl getenv PATH)"en ~ / .bash_profile (de manera similar para otros shells). Esto es posible ya que path_helperse llama en el script de shell. Para obtener más detalles sobre la variable PATH en OS X, consulte esta respuesta .
Percival Ulises
3

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
Mateo
fuente
Tuve el mismo comportamiento con El Capitán, y he agregado su punto a la respuesta de @ flori
Seki,
2

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 0y 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 Finderpuede agregarse.

En el .bash_profileuso 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 .

Ury Marshak
fuente
0

Otra opción es usar /etc/launchd.conf. Por ejemplo, he cambiado el valor predeterminado PATHagregando 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.confreiniciando o ejecutando, launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conffinalizando y reiniciando procesos.

La configuración se /etc/launchd.confaplica tanto al proceso de lanzamiento raíz como a los procesos de lanzamiento por usuario. Las variables de entorno establecidas con setenvin /etc/launchd.confse muestran con ambos sudo launchctl exporty launchctl export.

Lri
fuente