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"

ls에서 directory만 보이게 하자

ls로 directory만 보이게 하는 팁입니다. shell에서 다음과 같이 하면 됩니다.

ls --color -lh | awk '/^d/ { print }'

일일히 타이핑을 치기 어려우면, PATH가 있는 곳에 다음과 같이 shell을 만들어 둡니다. 저의 경우에는 ~/bin/lsd 로 해서 lsd를 치면 디렉토리가 나오게 했고, ls의 옵션을 쓰고 싶을 경우를 대비해서 파라미터를 받게 했네요.

#!/bin/bash
ls --color -lh $* | awk '/^d/ { print }'

–color 등의 옵션은 본인의 구미에 맞게 쓰시면 됩니다. 혹시 디렉토리만 보이고 싶으시다면, print $NF 로 쓰셔도 괜찮습니다. 그러나 -l 옵션이 없으면 위의 문장은 실행되지 않을수 있습니다. 최소 ls -l 로 보여지는 것에서 첫문자가 d인 것만 출력하게 한 것이니까요.

다른 팁으로는 다음과 같이 쓸수도 있습니다.

l -al -d */

ubuntu에서 VIDEO_TS 를 DVD ISO로 굽기

예전에 받은 파일중에서 VIDEO_TS 혹은 AUDIO_TS 로 DVD파일을 받은 것이 있습니다. 이 파일을 바로 DVD에 그냥 구우면, DVD Player에서 볼 수 없습니다. 이 파일들을 ISO로 변환한후에 이 파일을 구어야 합니다. 방법은 다음과 같습니다.

mkisofs -dvd-video -o <ISOFILENAME>.iso <ROOT_DIRECTORY_of_VIDEO_TS>

위의 명령으로 ISO 파일을 만들 수 있습니다.

예를들어, ~/test/VIDEO_TS 가 있다고 하고, 테스트하는 ISO 파일이름을 iso_test.iso라고 한다면,

mkisofs -dvd-video -o iso_test.iso ~/test

라고 하면 됩니다.