bash shell에서 eval, exec, source(.)에 관한 노트

Bash Shell 초보자가 헥깔리기 쉬운 eval, exec, source(.)에 관련한 노트입니다.

원문은 bash shell: ‘exec’, ‘eval’, ‘source’ – looking for help to understand 에서 발견했습니다. 여기에 기록상 카피합니다.

1. 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

2. 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."

3. 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.


# 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"

You May Also Like

2 Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다