티스토리 뷰

 

지난 글의 출발은 짧은 script

 

#!/bin/bash

if python3 
then
  echo "hahaha"
else
  echo "..."
fi

 

이었습니다. 이제 if 다음의 python3 가 이상하지 않습니다. 왜냐하면

 

if 일반적으로 다음에 command 가 따라온다.

 

을 알기 때문이지요. python3 는 command 이니 문제가 없습니다. ( ls, echo 등등을 python3 위치에 넣고 실행해 보세요!)

 

그럼 이제 python3 는 참이냐? 거짓이냐? 는 의문을 가질 수 있습니다.

 

But 다른 언어들과는 다르게 shell 에서

 

if 는 참, 거짓이 아니라 뒤따르는 command 의 exit code 를 바탕으로 분기

 

합니다. 그리고 command 가 정상 종료했을 때, 즉 exit code 가 0 일 때,  다른 언어들에서의 if 가 참일 때 동작하는 것처럼 동작합니다.

 

(test 나 [ command 는 주어진 logical expression 이 참일 때, exit code 가 0 이 됩니다.)

 

앞의 script 를 실행하면 python3 REPL 로 진입합니다. 그리고 대충 종료하면 정상 종료이므로 "hahaha" 를 보게 됩니다.

 

만약 kill command 로 python3 를 종료시키면 "..." 를 보게 될 것입니다.

 

과정은 다른 언어와 다르지만 0 일 때, '참'인 것처럼 행동하다니 좀 당황스럽습니다.

 

 

 

 

'일반적으로' 

 

'일반적으로' 라는 문구를 계속 강조해 왔습니다.

 

사실 if 다음에 와도 되는 것과 아닌 것에 대해 reference manual 을 봐도 명확한 설명이 나오지는 않습니다.

 

그렇다고 shell code 를 들여다보고 싶은 마음도 없습니다.

 

그래서 [ , [[ 와 test 같이 지극히 자연스러운 것 외에는 몇 가지만 기억합시다.

 

script 에서 작성된 함수도 command 처럼 여길 수 있다! 즉, if 뒤에 script 에서 작성된 함수가 와도 된다.

 

 shell script 에서 작성도 함수도 command 로 취급됩니다. 하지만 주의해야 할 점이 있습니다.

 

다음의 script 를 실행해 봅니다.

 

#!/bin/bash

function myfunc() {
  return 0            # exit 0 으로 바꾸면 script 를 종료하므로 결과를 볼 수 없습니다!
}

if myfunc
then
  echo "hahaha"
fi

 

이 때, myfunction의 return value 가 0 일 때, if 는 조건이 참인 것처럼 행동해서 then 다음의 문장을 수행합니다. hahaha

 

그리고 주석에 쓴 것처럼 exit 는 script 자체를 종료시키므로 hahaha 를 보지는 못합니다. 

 

- 잠깐! 그렇다면 이제까지 본 if 에 뒤따르는 [ 나 test 는 exit 로 종료한 게 아니고 return 한 거였나?

 

- 아닙니다. command 들은 독립된  process 이기 때문에 exit 로 종료하지만 단지 자기 process 를 종료할 뿐, script 에 의해 생성된 process를 종료시키지는 않았던 것입니다.

 

위의 script 를 살짝 변형합니다. 

 

#!/bin/bash

function myfunc() {
  exit 0            
}

if (myfunc)
then
  echo "hahaha"
fi

 

return 이 exit 로 바뀌고 myfunc이 (myfunc) 으로 바뀌었지요.

 

이번에는 myfunc 이 exit 로 종료하지만 hahaha 를 볼 수 있습니다.

 

shell scripting 에서 ( ) 는 어떤 경우에도 subshell 을 호출을 의미합니다.

 

즉, fork 에 의해 script 에 의해 생성된 process 의  child process 를 만들어서 ( ) 안의 command 를 수행합니다. 

 

따라서 exit 는 child process 를 벗어나게 해주고 다시 script 로 만들어진 process 로 돌아오게 된 것입니다. 

 

별 내용도 없는데 글은 길어지는군요.

 

귀찮으시면 

 

if 다음에는 script 내부에서 작성된 함수가 올 수 있다. 이때, return 값이 0 이면 if 참인 것처럼 동작한다.

 

만이라도 기억해 둡시다.

 

command 와 function 외에 if 에 뒤따라 오는 것들 다음 글에서 정리하도록 하겠습니다. 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함