eval “translates” a value buried inside a variable, and then runs the command that was buried in there
for i in 1 2 3 do eval myvar="$i" echo "$myvar" done # this gives 1 2 3 # why? because there is no metavalue or special meaning to 1 or 2 or 3
for i in ls df do eval myvar="$i" echo "$myvar" done # here you get output from the ls command and the df command
exec starts another process – BUT – it exits the current process when you do this kind of thing
#!/bin/bash exec echo "leaving this script forever $0" # Exit from script here. # ---------------------------------- # The following line never happens echo "This echo will never echo."
When you run a command in the shell – like another script or a command like ls –
the shell creates a subprocess (called child process). Any environment variable that got defined or changed down in the child is LOST FOREVER to the parent process.
However if you source a script (there are two ways) you force the script to run in the current process. That means environment variables in the script you ran are NOT LOST.
# script1 MYVAR="HI there!" # end script1
# script2 # first, run script 1 script1 # now is the MYVAR variable set? No -why? it got set in the child, when the child exited it GOT LOST echo "MYVAR= $MYVAR" # now source script1 :: putting a lonesome dot or the command "source" # in front of the script name have the same effect . script1 # . script1 == source script1 these two are the SAME THING source script1 # now is the MYVAR variable set? This time we see that MYVAR has a value echo "MYVAR= $MYVAR"