105 votos

Cómo agregar una variable de entorno permanente en zsh

He estado buscando por internet y no logro encontrar una solución para agregar permanentemente una variable de entorno, específicamente cuando mi sistema operativo es macOS Mojave (10.14). Parece que hay muchos tutoriales para versiones anteriores del sistema operativo, pero ninguno para esta versión. Además, parece que todos los métodos antiguos están obsoletos.

Quiero agregar una variable de entorno ENV_VAR=12345 a mi Mac, para poder importarla en un módulo de Python usando os.environ['ENV_VAR']

El tutorial más relevante que he encontrado es este, pero no termina de funcionar para mí. Muchos otros te dicen cómo agregar temporalmente variables de entorno a bash, pero creo que eso no es suficiente. Quiero que la adición esté ahí si reinicias la terminal.

¿Puedes por favor proporcionar un tutorial corto o indicarme el tutorial correcto/moderno?

ACTUALIZACIÓN: Debería haber mencionado que uso zsh. Esto era importante.

0 votos

0 votos

¿Se ejecuta el script de Python desde la línea de comandos o desde una aplicación en el escritorio o Finder?

0 votos

@Mark ¡El script se ejecuta desde la línea de comandos! A través de python -m module_name

117voto

slm Puntos 118

Bash

Dado que Bash suele ser la shell predeterminada, puedes abrir este archivo en tu directorio de inicio:

$ vim ~/.bash_profile

Y agregar tu variable a este archivo:

export ENV_VAR=12345

Incluso puedes hacer esto sin necesidad de editar el archivo utilizando el siguiente comando de una línea:

$ echo 'export ENV_VAR=12345' >> ~/.bash_profile

Luego confirma de la siguiente manera:

$ cat ~/.bash_profile
for i in ~/.bash_profile.d/[0-9]*; do
  . "$i"
done
export ENV_VAR=12345

Después de hacer lo anterior, si abres una nueva terminal verás que la variable de entorno ha sido establecida:

$ echo $ENV_VAR
12345

Zsh

Si descubres que estás utilizando una shell alternativa como zsh, que utiliza un conjunto diferente de archivos de configuración mantenidos dentro de tu directorio de inicio, ~. Afortunadamente, la sintaxis de los cambios es básicamente la misma, solo que los archivos son diferentes. Por lo tanto, puedes agregar el ejemplo anterior a este archivo en su lugar:

$ echo 'export ENV_VAR=12345' >> ~/.zshenv

Y luego cuando inicies una terminal zsh:

$ echo $ENV_VAR
12345

Referencias

0 votos

Nota: Si deseas que un ENV sea accesible fuera de algo lanzado desde un contexto de shell, como al ejecutar un script de Python directamente, establecerlo en tus archivos de configuración de bash/zsh no lo resolverá. Necesitarías usar launchctl setenv ENV_NAME ENV_VALUE para hacerlo disponible en todas partes. Mira mi otra respuesta para más información.

3 votos

En MacOS Monterey, no tengo zshenv en el directorio del usuario ni en /etc. Por lo tanto, estoy usando $ echo 'export ENV_VAR=12345' >> ~/.zshrc para inyectar esta variable de entorno.

47voto

Guillermo Garcia Puntos 331

Primero, ejecuta en una terminal con zsh (Z Shell):

echo 'export ENV_VAR=12345' >> ~/.zshenv

Luego, recarga los cambios:

source ~/.zshenv

Finalmente, prueba si tu nueva variable está configurada:

echo $ENV_VAR

Nota: Por estándar, el archivo .zshenv debe contener solo comandos de configuración de variables de entorno. El archivo .zshenv se carga en todas las invocaciones del shell, por lo tanto persistirá incluso después de reiniciar tu máquina.

1 votos

Quizás un poco obvio para expertos, pero el comando source funcionó para mí y ni siquiera tuve que volver a abrir otra terminal. (a diferencia de la respuesta aceptada)

4voto

Khb Puntos 1002

Las otras soluciones describen cómo establecer una variable de entorno en todas sus instancias de shell zsh/bash. Pero no establecen un ENV permanente que esté disponible en todas partes en macOS, incluido en cada programa iniciado.

Por ejemplo, si define ENV_VAR=1 en su .zshrc pero inicia Python directamente sin lanzarlo desde una terminal, entonces cualquier cosa establecida en su .zshrc no estaría disponible en os.environ['...'].

Para resolver esto, puede establecer una variable de entorno verdaderamente global en macOS a nivel del sistema utilizando launchctl de esta manera:

launchctl setenv "ENV_VAR" "12345"

Después de ejecutar eso, cada programa recién lanzado verá la variable de entorno ENV_VAR, incluidas las instancias de shell, así como las cosas lanzadas sin una terminal. Deberá cerrar su aplicación de terminal y volver a abrirla para que esté en su shell. Tampoco aparecerá en sesiones de ssh, que no son iniciadas por launchd como los programas GUI.

Actualización: Parece que esto no persiste a través de reinicios del sistema. Puede encontrar alguna discusión al respecto aquí. Curiosamente, una solución decente para esto es simplemente poner launchctl setenv ... en el .zshenv o .bash_profile de su terminal. Aunque eso significa que necesitará iniciar una terminal antes de que se establezcan las variables globales, por lo que puede ver algunas soluciones más robustas que involucran la creación de un nuevo trabajo de launchd aquí.

2voto

Por lo que vale, uso este shell portátil función para configurar & añadir permanentemente variables de entorno rápidamente.

Principalmente uso zsh, pero se puede adaptar fácilmente para bash u otras conchas compatibles con POSIX.

# -----------------------------------------
#  Crear variable de entorno permanente
#
#  $1 - nombre de la variable
#  $2 - definición de la variable
#  @requires: '~/.zshrc' o '~/.bashrc'
# -----------------------------------------
función new_env_var {
  local shell_detectado="$(ps -o comm= -p $$)"
  local archivo_rc=$(echo "${HOME}/.${shell_detectado//-/}rc")
  if [[ -f $archivo_rc ]]; then
    local nombre_var; local val_var
    if [ -z "$1" ]; then
      echo "nombre de la variable (por ejemplo, 'NUEVA_VAR' para '\$NUEVA_VAR'):"; read nombre_var
    else
      nombre_var=$1
    fi
    if [ -z "$2" ]; then
      echo "definición de la variable:"; read val_var
    else
      local s2 val_var="${@//${nombre_var}/}"
      hasta que s2="${val_var#[   ]}"; [ "$s2" = "$val_var" ]; hacer val_var="$s2"; hecho
    fi
    echo "export $nombre_var=\"$val_var\"" >> $archivo_rc; export $nombre_var="$val_var"
  else
    echo "No se encontró ningún archivo de inicio de sesión para $shell_detectado. Por favor, asegúrese de que existe $archivo_rc."
  fi
}

Puedes usarlo así:     new_env_var MI_VAR_ENV 9,999

2voto

Topgyal Gurung Puntos 1

Muestra todos los archivos ocultos como .bash_profile y .zshrc $ ls -a

A partir de macOS Catalina, macOS utiliza zsh en lugar de bash para las cuentas recién creadas.

Verifica qué shell estás usando:

$ echo $SHELL
/usr/zsh

$ cd $HOME
$ open -e .zshrc

o si estás usando vim

$ vi .zshrc

Luego agrégalo así

$ export my_var="/ruta/donde/está"
$ export PATH=$PATH:/$my_var/bin

Por ejemplo: si tienes una aplicación llamada myapp en /Applications Entonces

export MYAPP_HOME=/Applications/myapp
export PATH=$PATH:$MYAPP_HOME/bin

o atajo

export PATH=${PATH}:/Applications/myapp/bin

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X