Tengo varias cuentas de Amazon EC2 y quiero poder cambiar rápidamente de variable, como $EC2_HOME
, usando 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_HOME
está configurado, pero pensé que usar export
haría que la variable se quedara después de que se completara el script. No es así, ya que ejecutar echo $EC_HOME
no muestra nada.
Sé que esto debe ser un conocimiento muy rudimentario de secuencias de comandos de Linux, pero no lo sé. Intenté buscar preguntas relacionadas sin suerte, así que mis disculpas si esto es un duplicado.
Respuesta
Debe obtener su secuencia de comandos, con
. ./script
o
source ./script
Comentarios
- la razón es que su script genera un nuevo proceso de shell como un hijo del shell actual. Cualquier cambio de entorno que realice en el proceso hijo no puede afectar al padre. Cuando utilice
.
osource
, no está generando un nuevo proceso hijo, está ejecutando los comandos en el shell actual. - @glennjackman Tengo un problema similar y probé su solución, pero me desconecta del shell cuando hago
.
osource
. ¿Por qué sucede esto? pening? - @Patryk: tal vez su secuencia de comandos tenga una instrucción
exit
, por lo que no es adecuado para obtenerla. - Si bien
source ./script
funciona completamente bien,sudo source ./script.sh
dicesudo: source: command not found
. ¿Cómo puedo hacer esto usando sudo? - @ 71GA: según las preferencias de compilación para
sudo
y según los ajustes de configuración en/etc/sudoers
puede o no puede conservar su entorno cuando ejecuta comandos consudo
. Le sugiero que intente obtener su secuencia de comandos y luego ejecutesudo
con la opción-E
para preservar el medio ambiente. Si no funciona, supongo que hay muy poco que puedas hacer.
Responder
Cuando ejecutas un script obtiene su propio shell y su propio entorno, que desaparecen de nuevo tan pronto como finaliza el script. Para mantener las variables de entorno, ingrese el script en su shell actual:
$ source ./a.sh
o de manera equivalente (pero un poco más portátil) use el POSIX dot command :
$ . ./a.sh
Luego, las definiciones se colocarán en el entorno de su shell actual y se heredarán por cualquier programa que inicie desde él.
Para estar más cerca de ejecutar un script, . a.sh
encontrará a.sh buscando los directorios en el PATH
variable de entorno.
Hay algunas sutilezas en su comportamiento, y si .
y source
son iguales (o están presentes). . ./a.sh
definitivamente se comportará igual en todos los shell compatibles con POSIX, pero source
y .
, y . a.sh
y . ./a.sh
, pueden variar . Para Bash source
y .
son iguales en todos los casos; para zsh source
siempre comprueba primero el directorio actual ; ksh es esencialmente similar.
Si el nombre del script se proporciona como una ruta (que contiene un /
), esa ruta se usa directamente en todos los casos. Lo más portátil y confiable que se puede hacer es . ./script
o . /path/to/script
.
Responder
Solo para el registro.
Si desea ejecutar un script desde Internet que exporta env al sistema
puede 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)
Comentarios
- ¡Parece peligroso pero útil si confías en ese script!
Responder
Prueba
exec ./script
El comando exec ejecuta el script en el shell actual sin iniciar el shell no interactivo.