Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I export a variable to the environment from a Bash script without sourcing it?

Suppose that I have this script:

export.bash:

#! /usr/bin/env bash export VAR="HELLO, VARIABLE" 

When I execute the script and try to access to the $VAR, I don't get any value!

echo $VAR 

Is there a way to access the $VAR by just executing export.bash without sourcing it?

like image 990
Salah Eddine Taouririt Avatar asked May 17 '13 21:05

Salah Eddine Taouririt


People also ask

How do I export an environment variable in Bash?

The easiest way to set environment variables in Bash is to use the “export” keyword followed by the variable name, an equal sign and the value to be assigned to the environment variable.

Does shell script inherit environment variable?

Shell variables are variables that apply to our current shell only and are not inherited by any programs or scripts that we execute.


2 Answers

Is there any way to access to the $VAR by just executing export.bash without sourcing it ?

Quick answer: No.

But there are several possible workarounds.

The most obvious one, which you've already mentioned, is to use source or . to execute the script in the context of the calling shell:

$ cat set-vars1.sh  export FOO=BAR $ . set-vars1.sh  $ echo $FOO BAR 

Another way is to have the script, rather than setting an environment variable, print commands that will set the environment variable:

$ cat set-vars2.sh #!/bin/bash echo export FOO=BAR $ eval "$(./set-vars2.sh)" $ echo "$FOO" BAR 

A third approach is to have a script that sets your environment variable(s) internally and then invokes a specified command with that environment:

$ cat set-vars3.sh #!/bin/bash export FOO=BAR exec "$@" $ ./set-vars3.sh printenv | grep FOO FOO=BAR 

This last approach can be quite useful, though it's inconvenient for interactive use since it doesn't give you the settings in your current shell (with all the other settings and history you've built up).

like image 197
Keith Thompson Avatar answered Oct 07 '22 23:10

Keith Thompson


In order to export out the VAR variable first, the most logical and seemly working way is to source the variable:

. ./export.bash 

or

source ./export.bash 

Now when echoing from the main shell, it works:

echo $VAR HELLO, VARIABLE 

We will now reset VAR:

export VAR="" echo $VAR 

Now we will execute a script to source the variable then unset it:

./test-export.sh HELLO, VARIABLE -- . 

The code: file test-export.sh

#!/bin/bash # Source env variable source ./export.bash  # echo out the variable in test script echo $VAR  # unset the variable unset VAR # echo a few dotted lines echo "---" # now return VAR which is blank echo $VAR 

Here is one way:

Please note: The exports are limited to the script that execute the exports in your main console - so as far as a cron job I would add it like the console like below... for the command part still questionable: here is how you would run in from your shell:

On your command prompt (so long as the export.bash file has multiple echo values)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh HELLO THERE HI THERE 

File cat v1.sh

#!/bin/bash echo $VAR echo $VAR1 

Now so long as this is for your usage - you could make the variables available for your scripts at any time by doing a Bash alias like this:

myvars ./v1.sh HELLO THERE HI THERE  echo $VAR  . 

Add this to your .bashrc file:

function myvars() {     IFS=$'\n';     for entries in $(./export.bash); do  export $entries;  done;      "$@";      for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;     done } 

Source your .bashrc file and you can do like the above any time...

Anyhow back to the rest of it...

This has made it available globally then executed the script...

Simply echo it out and run export on the echo!

File export.bash

#!/bin/bash echo "VAR=HELLO THERE" 

Now within script or your console run:

export "$(./export.bash)" 

Try:

echo $VAR HELLO THERE 

Multiple values so long as you know what you are expecting in another script using the above method:

File export.bash

#!/bin/bash echo "VAR=HELLO THERE" echo "VAR1=HI THERE" 

File test-export.sh

#!/bin/bash  IFS=$'\n' for entries in $(./export.bash); do     export $entries done  echo "round 1" echo $VAR echo $VAR1  for entries in $(./export.bash); do     variable=$(echo $entries|awk -F"=" '{print $1}');     unset $variable done  echo "round 2" echo $VAR echo $VAR1 

Now the results

./test-export.sh round 1 HELLO THERE HI THERE round 2   . 

And the final final update to auto assign, read the VARIABLES:

./test-export.sh Round 0 - Export out then find variable name - Set current variable to the variable exported then echo its value $VAR has value of HELLO THERE $VAR1 has value of HI THERE round 1 - we know what was exported and we will echo out known variables HELLO THERE HI THERE Round 2 - We will just return the variable names and unset them round 3 - Now we get nothing back 

The script:

File test-export.sh

#!/bin/bash  IFS=$'\n' echo "Round 0 - Export out then find variable name - " echo "Set current variable to the variable exported then echo its value" for entries in $(./export.bash); do     variable=$(echo $entries|awk -F"=" '{print $1}');     export $entries     eval current_variable=\$$variable     echo "\$$variable has value of $current_variable" done   echo "round 1 - we know what was exported and we will echo out known variables" echo $VAR echo $VAR1  echo "Round 2 - We will just return the variable names and unset them " for entries in $(./export.bash); do     variable=$(echo $entries|awk -F"=" '{print $1}');     unset $variable done  echo "round 3 - Now we get nothing back" echo $VAR echo $VAR1 
like image 45
V H Avatar answered Oct 07 '22 23:10

V H