This question already has answers here:
Pass all variables from one shell script to another?
(7 answers)
Closed 3 years ago.
OS: Ubuntu 18.04
Bash
I am trying to get one shell script to pass variables to another script and execute it. Here's what I tried:
mainscript.sh
#!/bin/bash
# Master script
SUBSCRIPT1_PATH=~/subscript1.sh
test_string="The cat ate the canary"
(exec "$SUBSCRIPT1_PATH")
subscript1.sh:
#!/bin/bash
# subscript1.sh
echo $test_string
But, when I do:
bash mainscript.sh
I get nothing. Any ideas on how to do this?
Shell variables are by default not visible in child processes. To pass them to children use the export keyword:
#!/bin/bash
# Master script
SUBSCRIPT1_PATH=~/subscript1.sh
export test_string="The cat ate the canary"
(exec "$SUBSCRIPT1_PATH")
Related
This question already has answers here:
Source files in a bash script
(2 answers)
Can I export a variable to the environment from a Bash script without sourcing it?
(13 answers)
Closed 2 years ago.
Here is what I have:
script_1.sh
echo "HELLO FROM script_1.sh"
./scripts/script_2.sh
echo $MY_VARIABLE
script_2.sh
echo "HELLO FROM script_2.sh"
export MY_VARIABLE="MY_VALUE"
Here is what it logs when I run script_1.sh:
HELLO FROM script_1.sh
HELLO FROM script_2.sh
"" // EMPTY LINE INSTEAD OF "MY_VALUE"
What am I doing wrong?
Variables are exported from a parent to a child, not vice versa. script_2.sh is called in a different shell whose environment doesn't propagate back to the parent shell.
Source the script (using the .) to call it in the same shell. You then don't even need to export the value.
. ./scripts/script_2.sh
environment variables are inherited down the call chain. they are not returned up to the caller.
in other words: a called script might inherit the variables of the caller. but the caller will not get the variables of the called script.
in you simple example the easiest solution is to "source the script"
. ./scripts/script_2.sh
(the dot is the command to source a script)
sourcing is not a new step in the call chain. instead the sourcer and sourcee share the same environment. for more explanation on the difference of executing and sourcing see here: https://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-vs-sourcing-it/176788#176788
there are other options but they are more complicated and error prone. it seems that you are starting to learn shell scripting. so learn the difference of sourcing and executing and the implication on the environment for now. if you need other options later then come back and ask another question.
This question already has answers here:
Alias doesn't work inside a Bash script [duplicate]
(2 answers)
Closed 4 years ago.
I have some commands I would like to run in the following order:
HEADAS=/home/warano/HEASoft/heasoft-6.24/x86_64-pc-linux-gnu-libc2.27
export HEADAS
alias heainit=". $HEADAS/headas-init.sh"
heainit
CALDB=/home/warano/NUSTAR/caldb
export CALDB
source $CALDB/software/tools/caldbinit.sh
I put all of these in a script called run-nu_tools.sh, but it does not work so I got this output:
./run-nu_tools.sh: line 6: heainit: command not found
However heainit works if one runs everything in the terminal(step by step) so I want to run all at once, do you have any tips?
The problem is that aliases are not expanded if the shell is not interactive:
ALIASES: Aliases are not expanded when the shell is not interactive unless the expand_aliases shell option is set using shopt.
source: man bash
Add the following to your script:
shopt -s expand_aliases
This question already has answers here:
What does "export" do in shell programming? [duplicate]
(3 answers)
Closed 2 years ago.
If we set custom environment variables in .bashrc like the following:
TMP_STRING='tmp string'
It seems like this variable is not directly accessible from the bash script.
#!/bin/bash
echo $TMP_STRING
I tried the following, but it also doesn't work:
#!/bin/bash
source ~/.bashrc
echo $TMP_STRING
Could you suggest what would be the correct way in this case?
Thank you!
Just VAR=value defines a shell variable. Environment variables live in a separate area of process memory that is preserved when another process is started, but are otherwise indistinguishable from shell variables.
To promote a variable to an environment variable, you must export it.
Example:
VAR=value
export VAR
or
export VAR=value
If you put the above into .bashrc, the above value of $VAR should be available in the script, but only if it's run from the login shell.
I would not recommend sourcing .bashrc in the script. Instead, create a separate file named something like .script.init.sh and source that:
# script init
TMP_STRING='tmp string'
Your script:
# script
. ~/.script.init.sh
If this value must be available to any process spawned by the script, prefix it with export :
# script init
export TMP_STRING='tmp string'
This question already has answers here:
Can I export a variable to the environment from a Bash script without sourcing it?
(13 answers)
Closed 7 years ago.
I have two shell scripts:
First : 1.sh, it reads as follows:
export PROP="my val"
Second : 2.sh, it reads as follows:
./1.sh
echo $PROP
Both have execute permission. When I run 2.sh, I am expecting that environment variable PROP set and exported by 1.sh, is visible to echo $PROP statement in 2.sh and would get printed. But output is blank indicating that PROP is not visible to 2.sh. What is wrong here?
Try sourcing the script in the current process:
. 1.sh
echo $PROP
And you can then drop export altogether:
PROP="my val"
The problem is that you're running 1.sh in a new shell process, so any changes it makes to its environment are lost when the process ends. Specifically, export makes the variable available to children of the current process, so in this case it cannot affect 2.sh (the parent process).
This question already has answers here:
Can I export a variable to the environment from a Bash script without sourcing it?
(13 answers)
Closed 3 years ago.
I have a simple environment setup script that exports some environment variables like so.
#!/bin/sh
export NEWROOT=~/some/directory
echo $NEWROOT
This echos the correct directory, but after its run, when I echo $NEWROOT in the same shell, it returns nothing.
Any idea why the variable isn't setting?
The shell is run in a separate process, and environment variables in a child process do not affect the environment variables in the parent process.
If you want to run the script in the same process, you can use the dot command, like this:
. myscript
A child process can't affect the environment variables of its parent. If you source the script instead, that will evaluate the script in the current environment, leaving NEWROOT.