Search code examples
bashsudo

where did my environment variable go?


I am trying to use an environment variable in a bash script that needs to run as sudo with source.

I have the following file (my_file.sh)

 echo "this is DOMAIN = $DOMAIN"

I have the DOMAIN environment variable in my session..

and now I need to run

  sudo -E bash -c "source ./my_file.sh"

but the output does not display the value for $DOMAIN. instead it is empty.

if I change the command to be

  sudo -E bash -c "echo $DOMAIN"

I see the correct value..

what am I doing wrong?


Solution

  • With the command line:

    sudo -E bash -c "source ./my_file.sh"
    

    you are running a script that may refer to environment variables that would need to be exported from a parent shell to be visible.

    On the other hand:

    sudo -E bash -c "echo $DOMAIN"
    

    expands the value of $DOMAIN in the parent shell, not inside your sudo line.

    To demonstrate this, try your "working" solution with single quotes:

    sudo -E bash -c 'echo $DOMAIN'
    

    And to make things go, try exporting the variable:

    export DOMAIN
    sudo -E bash -c "source ./my_file.sh"
    

    Or alternately, pass $DOMAIN on the command line:

    sudo -E bash -c "source ./my_file.sh $DOMAIN"
    

    And have your script refer to $1.