¿Cómo puedo hacer que las variables de entorno "exportadas" en un script de shell permanezcan?

54

Tengo varias cuentas de Amazon EC2 y quiero poder cambiar rápidamente las variables, como el $EC2_HOMEuso de un script.

Tengo un script de shell configurado así:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Cuando ejecuto el script, sé que EC2_HOMEestá configurado, pero pensé que usarlo exportharía que la variable se quedara después de que se completara el script. No lo hace, ya que correr echo $EC_HOMEno muestra nada.

Sé que esto debe ser un conocimiento de scripts de Linux muy rudimentario, pero no lo sé. Intenté buscar preguntas relacionadas sin suerte, así que disculpen si esto es un duplicado.

cwd
fuente

Respuestas:

60

Debes obtener tu script, con

. ./script

o

source ./script
enzotib
fuente
19
la razón es que su script genera un nuevo proceso de shell como hijo del shell actual. Cualquier cambio en el entorno que realice en el proceso secundario no puede afectar al padre. Cuando usa .o source, no está generando un nuevo proceso hijo, está ejecutando los comandos en el shell actual.
Glenn Jackman
1
@glennjackman Tengo un problema similar y he probado su solución, pero me desconecta de Shell cuando lo hago .o source. Por qué está pasando esto ?
Patryk
77
@Patryk: tal vez su secuencia de comandos tiene una exitdeclaración, por lo que no es adecuado para su fuente.
enzotib
Si bien source ./scriptfunciona completamente bien, sudo source ./script.shdice sudo: source: command not found. ¿Cómo puedo hacer esto usando sudo?
71GA
1
@ 71GA: dependiendo de las preferencias de compilación sudoy de los ajustes de configuración /etc/sudoers, puede o no preservar su entorno al ejecutar comandos con sudo. Le sugiero que intente obtener su script y luego ejecutar sudocon la -Eopción para preservar el entorno. Si no funciona, supongo que hay muy poco que puedas hacer.
enzotib
36

Cuando ejecuta un script, obtiene su propio shell y su propio entorno, que desaparecen nuevamente tan pronto como finaliza el script. Para mantener las variables de entorno, cree el script en su shell actual:

$ source ./a.sh

o de manera equivalente (pero un poco más portátil) use el comando de punto POSIX :

$ . ./a.sh

Luego, las definiciones se colocarán en el entorno de su shell actual y serán heredadas por cualquier programa que inicie desde él.

Para estar más cerca de ejecutar un script, . a.shencontrará a.sh buscando en los directorios de la PATHvariable de entorno.


Hay algunas sutilezas en cómo éstas se comportan, y si .y sourceson los mismos (o presente en todos). . ./a.shdefinitivamente se comportará igual en todos los shell compatibles con POSIX, pero sourcey ., y . a.shy . ./a.sh, pueden variar. Para Bash sourcey .son los mismos en todos los casos; para zsh sourcesiempre verifica primero el directorio actual ; ksh es esencialmente similar.

Si el nombre del script se proporciona como una ruta (que contiene a /), esa ruta se usa directamente en todos los casos. La cosa más confiable y portátil que se puede hacer es . ./scripto . /path/to/script.

Michael Homer
fuente
1

Solo para el registro.

Si desea ejecutar un script desde internet que exporta env al sistema

puedes usar el siguiente formato

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Por ejemplo:

source <(curl -s -L https://example.com/install.sh)
caramelo
fuente
¡Parece peligroso pero útil si confías en ese script!
Mark Stewart