eval "translates" a value buried inside a variable, and then runs the command that was buried in there
Code:
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
Code:
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 temporally when you do this kind of thing until the new process is finished
Code:
#!/bin/bash exec echo "leaving this script forever $0" # Exit from script here. # ---------------------------------- # The following line never happens echo "This echo will never echo."
moreover, a "&" tail means that run the new process in backgroud.
source
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.
Code:
# script1 MYVAR="HI there!" # end script1
Code:
# 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"