Variables de entorno en Mac OS X

186

Actualización: el siguiente enlace no tiene una respuesta completa . Tener que establecer la ruta o variable en dos lugares (uno para GUI y otro para shell) es poco convincente.

No duplicado de : ¿ Establecer variables de entorno en OS X?


Viniendo de un fondo de Windows donde es muy fácil establecer y modificar variables de entorno (solo vaya a Propiedades del sistema> Avanzado> Variables de entorno), no parece ser tan sencillo en Mac OS 10.5. La mayoría de las referencias dicen que debería actualizar / etc / profile o ~ / .profile. ¿Son los equivalentes de las variables del sistema y las variables de usuario? Por ejemplo, ¿dónde debo configurar mi JAVA_HOMEvariable?


EDITAR:

Quiero poder acceder a la variable desde el terminal, así como a una aplicación como Eclipse. Además, espero no tener que reiniciar / cerrar sesión para que esto surta efecto.

Abdullah Jibaly
fuente
Y hay algunos consejos en las respuestas a la pregunta de enlace no se repite aquí ...
dmckee --- ex-moderador gatito

Respuestas:

142

No hay necesidad de duplicación. Puede establecer variables de entorno utilizadas por launchd (y procesos secundarios, es decir, cualquier cosa que comience desde Spotlight) usandolaunchctl setenv .

Por ejemplo, si desea reflejar su ruta actual en launchd después de configurarla en .bashrco donde sea:

PATH=whatever:you:want
launchctl setenv PATH $PATH

Las variables de entorno no se actualizan automáticamente en las aplicaciones en ejecución. Deberá reiniciar las aplicaciones para obtener las variables de entorno actualizadas (aunque solo puede establecer variables en su shell, por ejemplo PATH=whatever:you:want, no es necesario reiniciar el terminal).

Matt Curtis
fuente
1
Parece la mejor respuesta hasta ahora, ¡no es necesario una aplicación de terceros!
Abdullah Jibaly
2
Esto no parece ser global: las variables de entorno establecidas de esta manera son locales para el usuario. Todavía no tenemos un mecanismo global para establecer una variable de entorno.
Andrew
@ Andrew ¿Qué quieres decir con local para el usuario? Esperaría que todos los procesos iniciados posteriormente desde launchd se vean afectados.
Matt Curtis
@MattCurtis: las variables de entorno establecidas a través de launchctl setenvparecen ser solo visibles para el usuario que realiza el cambio. Si configuro una variable como usuario ordinario, no es visible para root (a través de sudo) y viceversa.
Andrew
2
@Andrew OK, root tiene su propio launchd, ps aux | grep launchdlo mostrará. Compruebe también man sudoqué documentos sudo(de forma predeterminada) restablecen deliberadamente el entorno, si sudo -Econservará el entorno (incluidas las variables que haya configurado launchctl setenv). ¿Tienes una aplicación real para esto, por cierto? Si es así, ¿este método funciona para usted?
Matt Curtis
299

Hay varios lugares donde puede establecer variables de entorno.

  • ~/.profile: use esto para las variables que desea establecer en todos los programas iniciados desde la terminal (tenga en cuenta que, a diferencia de Linux, todas las shells abiertas en Terminal.app son shells de inicio de sesión).
  • ~/.bashrc: esto se invoca para shells que no son shells de inicio de sesión. Use esto para los alias y otras cosas que deben redefinirse en subcapas, no para las variables de entorno heredadas.
  • /etc/profile: esto se carga antes de ~ / .profile, pero por lo demás es equivalente. Úselo cuando desee que la variable se aplique a los programas de terminal iniciados por todos los usuarios en la máquina (suponiendo que usen bash).
  • ~/.MacOSX/environment.plist: esto se lee mediante loginwindow al iniciar sesión. Se aplica a todas las aplicaciones, incluidas las GUI, excepto las lanzadas por Spotlight en 10.5 (no 10.6). Requiere que cierre sesión y vuelva a iniciar sesión para que los cambios surtan efecto. Este archivo ya no es compatible a partir de OS X 10.8.
  • la launchdinstancia de su usuario : esto se aplica a todos los programas lanzados por el usuario, la GUI y la CLI. Puede aplicar los cambios en cualquier momento utilizando el setenvcomando en launchctl. En teoría , debería poder poner setenvcomandos ~/.launchd.confy launchdleerlos automáticamente cuando el usuario inicia sesión, pero en la práctica nunca se implementó el soporte para este archivo. En su lugar, puede usar otro mecanismo para ejecutar un script al iniciar sesión y hacer que ese script llame launchctlpara configurar el launchdentorno.
  • /etc/launchd.conf: Esto es leído por launchd cuando el sistema se inicia y cuando un usuario inicia sesión. Afectan a cada proceso en el sistema, porque launchd es el proceso raíz. Para aplicar los cambios a la raíz ejecutable launchd puede canalizar los comandos sudo launchctl.

Las cosas fundamentales para entender son:

  • Las variables de entorno son heredadas por los hijos de un proceso en el momento en que se bifurcan.
  • el proceso raíz es una instancia de launchd, y también hay una instancia de launchd separada por sesión de usuario.
  • launchd le permite cambiar sus variables de entorno actuales usando launchctl; las variables actualizadas son heredadas por todos los procesos nuevos que bifurca a partir de ese momento.

Ejemplo de establecer una variable de entorno con launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Ahora, inicie su aplicación GUI que usa la variable, ¡y listo!

Para evitar el hecho de que ~/.launchd.confno funciona, puede poner el siguiente script en ~/Library/LaunchAgents/local.launchd.conf.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>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Luego puede ponerlo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEdentro ~/.launchd.conf, y se ejecutará en cada inicio de sesión.

Tenga en cuenta que, al canalizar una lista de comandos en launchctl de esta manera, no podrá establecer variables de entorno con valores que contengan espacios. Si necesita hacerlo, puede llamar launchctl de la siguiente manera: launchctl setenv MYVARIABLE "QUOTE THE STRING".

Además, tenga en cuenta que otros programas que se ejecutan al iniciar sesión pueden ejecutarse antes del iniciador y, por lo tanto, pueden no ver las variables de entorno que establece.

Laca
fuente
3
En realidad, con respecto ~/.MacOSX/environment.plista mi León, se lee y se usa. Solo lo probé. De hecho, lo prefiero a .launchd.conf porque uso el panel de preferencias RCenvironment para mantenerlo.
Gilimanjaro
55
No se puede ~/.launchd.conftrabajar en 10.6.8, no parece tener ningún efecto. También la página del manual dice que este archivo no es compatible actualmente.
snowcrash09
44
~ / .launchd.conf tampoco parece funcionar en 10.7.3 y cuando miro en la página del manual dice $ HOME / .launchd.conf Su archivo de configuración de launchd (actualmente no compatible)
creativo
44
En 10.8 (Mountain Lion), ~ / .MacOSX / environment.plist ya no es compatible. Según Apple Dev, uno debe "Cambiar la lista de información del .app para contener un diccionario" LSEnvironment "con las variables de entorno que desee". Para obtener más información, visite apple.stackexchange.com/questions/57385/…
pnkfelix
3
@LaC Gran publicación completa; ¿podría actualizarlo para tener en cuenta que ~/.launchd.conftodavía no es compatible y no funciona a partir de OS X 10.8.3? Verman launchd.conf
mklement0
12

Creo que lo que está buscando el OP es una solución simple, similar a Windows.

aqui tienes:

https://www.macupdate.com/app/mac/14617/rcenvironment

Tom Teman
fuente
1
Wow, esto se ve genial. No lo he probado todavía, pero parece exactamente lo que necesitaba de la descripción.
Abdullah Jibaly
66
por cierto, el enlace original parece haberse roto desde que lo publiqué (¿qué pasa Apple? ¿Los 301 son caros?). En su lugar, puede usar este enlace: macupdate.com/app/mac/14617/rcenvironment
Tom Teman el
Esto es muy viejo Vea la otra respuesta que menciona osx-env-sync para una solución moderna que funciona incluso en OS X 10.10 (Yosemite) y versiones posteriores.
Warren P
1
Resuma la información del enlace en su respuesta. Como ya hemos visto, los enlaces se rompen por una variedad de razones.
usuario3.1415927
7

Puede leer en Linux, que es bastante parecido a lo que es Mac OS X. O puede leer en BSD Unix, que está un poco más cerca. En su mayor parte, las diferencias entre Linux y BSD no son demasiado.

/etc/profile son variables de entorno del sistema.

~/.profile son variables de entorno específicas del usuario.

"¿Dónde debo configurar mi variable JAVA_HOME?"

  • ¿Tienes múltiples usuarios? ¿Les importa? ¿Desordenaría a algún otro usuario cambiando un /etc/profile?

En general, prefiero no meterme con la configuración de todo el sistema, aunque soy el único usuario. Prefiero editar mi configuración local.

S.Lott
fuente
5

Para las aplicaciones GUI, deberá crear y editar ~/.MacOSX/environment.plist. Más detalles aquí . Deberá cerrar sesión para que estos surtan efecto. No estoy seguro de si también afectan a las aplicaciones iniciadas desde Terminal, pero supongo que lo harían.

Para las aplicaciones iniciadas desde Terminal, también puede editar el archivo ~ / .profile.

JW
fuente
2
Sí, Terminal heredará las variables, al igual que todo lo que se inicie desde Terminal. Puede usar el panel de preferencias RCenvironment para mantener las variables.
Gilimanjaro
1
Esta solución ya no funciona con algunas revisiones de Mac OS X v10.7. No lo hace con ninguna revisión de Mac OS X v10.8 o superior. En su lugar, consulte: stackoverflow.com/a/4567308/543738
LS
3

Simplemente abra el ~/.profilearchivo, nanoen Terminal y escriba allí:

export PATH=whatever/you/want:$PATH

Guarde este archivo (cmd + X e Y). Después de eso, cierre sesión / vuelva a iniciar sesión o simplemente abra una nueva pestaña en Terminal e intente usar su nueva variable.

NO olvides agregar ": $ PATH" después de lo que quieras / lo que quieras, de lo contrario, borrarás todas las rutas en la variable PATH, que estaban allí antes.

Migele
fuente
44
Esto solo se aplica al entorno de comando bash. Las aplicaciones GUI no ven las variables que establezca aquí.
Warren P
3

Sincronice las variables de entorno OS X para aplicaciones de línea de comandos y GUI desde una única fuente con osx-env-sync .

También publiqué una respuesta a una pregunta relacionada aquí .

Ersin Er
fuente
Esto es fantástico. Sugerencia: coloque el elemento launchctl unload / launctl load "actualizar ahora" en un script. Lo llamé osx-env-sync-now.sh. Modifico mi .bash_profile y ejecuto el pequeño script "actualizar ahora" y continúo. Creo que hay implicaciones de seguridad aquí, así que creo que deberían hacerse algunas limitaciones. Debe haber razones por las que desactivaron esta capacidad en OS X.
Warren P
@WarrenP Hecho! Revisa el repositorio.
Ersin Er
Excelente. Esto resolvió mucho dolor para mí. Un caso en el que esto es realmente útil es para cualquier persona que desarrolle con SCALA. Establecer SCALA_HOME tanto para la escala de línea de comando como para la escala de GUI (como en netbeans) es un verdadero problema de lo contrario.
Warren P
0

Si desea cambiar las variables de entorno de forma permanente en macOS, configúrelas /etc/paths. Tenga en cuenta que este archivo es de solo lectura de forma predeterminada, por lo que tendrá que modificarlo para obtener permisos de escritura.

IgorGanapolsky
fuente
Esto no funciona para mi. Tengo /usr/bin/localen ese archivo, incluso sin modificar el archivo, era así de forma predeterminada, y sin embargo, mis aplicaciones GUI solo ven /usr/bin:/bin:/usr/sbin:/sbin. Lo reinicié muchas veces.
mgol
@m_gol ¿Qué obtienes cuando corres cat /etc/paths/?
IgorGanapolsky
1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, en líneas separadas. Y sin embargo, SourceTree los ve a todos excepto al primero.
mgol
Es posible que desee editar a "Si desea cambiar la ruta predeterminada en macOS". Esto no tiene nada que ver con el problema más general de las variables de entorno.
rfay
0

Para usuarios de Mac OS X Catalina 2020:

Olvídate de otras respuestas inútiles, aquí solo se necesitan dos pasos:

  1. Cree un archivo con la convención de nomenclatura: priority-appname. Luego copie y pegue la ruta a la que desea agregar PATH.

    Por ejemplo, 80-vscodecon contenido /Applications/Visual Studio Code.app/Contents/Resources/app/bin/en mi caso.

  2. Mueve ese archivo a /etc/paths.d/. ¡No olvides abrir una nueva pestaña (nueva sesión) en la Terminal y escribir echo $PATHpara verificar que tu ruta esté agregada!

Aviso: este método solo agrega su ruta a PATH.

Lloviendo
fuente