Home > Blockchain >  Define environment variable in a subshell with heredoc
Define environment variable in a subshell with heredoc

Time:11-02

Background: testing a bash script inside a pod where default user does not have sudo rights so that user cannot user vim or nano to create a .sh file so I have to find a way around with cat << EOF >> test.sh. I am doing some local test to make sure it's working properly first. Locally I am creating a file test.sh with nano. See below

#!/bin/bash
# test.sh
VAR="Test"
echo $VAR

When I cat it:

#!/bin/bash
# test.sh
VAR="Test"
echo $VAR%  

I save test.sh , made it execuatble chmod x test.sh and ran it with ./test.sh The output:

Test

Now when I try to mimic the same behavior in a bash heredoc instead this is the command I use:

cat <<EOF >> test.sh
#!/bin/bash
# test.sh
VAR="Test"
echo $VAR
EOF

I saved it and made it execuatble as well. The cat output is:

#!/bin/bash
# test.sh
VAR="Test"
echo 

So obviously running it wouldn't work. The output null. I think the issue I am facing is that the environment variable $VAR is not defined properly inside the subshell using heredoc.

CodePudding user response:

When you write this:

cat <<EOF >> test.sh
#!/bin/bash
# test.sh
VAR="Test"
echo $VAR
EOF

...that $VAR is expanded by your current shell (just like writing something like echo "$VAR"). If you want to suppress variable expansion inside your heredoc, you can quote it (note the quotes around 'EOF'):

cat <<'EOF' >> test.sh
#!/bin/bash
# test.sh
VAR="Test"
echo $VAR
EOF

This inhibits variable expansion just like single quotes (echo '$VAR').

  • Related