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 . o source, 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 . o source. ¿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 dice sudo: 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 con sudo. Le sugiero que intente obtener su secuencia de comandos y luego ejecute sudo 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *