티스토리 뷰
Bash Scripting 모르면 곤란한 것들 - if (2)
MathTrauma 2022. 7. 3. 12:13
지난 글의 출발은 짧은 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 에 뒤따라 오는 것들 다음 글에서 정리하도록 하겠습니다.
'Programming Language > Shell Programming' 카테고리의 다른 글
Bash Scripting 04 - 변수확장(2) (0) | 2022.07.14 |
---|---|
Bash Scripting 03 - Globbing (0) | 2022.07.11 |
Bash Scripting 02 - 변수확장(1) (0) | 2022.07.09 |
Bash Scripting 01 - 공백! (0) | 2022.07.09 |
Bash Scripting 모르면 곤란한 것들 - if (3) (0) | 2022.07.06 |
- Total
- Today
- Yesterday
- bash
- map
- dynamic programming
- Shell Programming
- nearest common ancestor
- persistent segment tree
- segment tree
- C++ big number
- 다익스트라
- Dijkstra
- fenwick tree
- Aho-Corasick
- 세그먼트 트리
- max flow
- lazy propagation
- python3
- BOJ
- bash script
- 정수론
- shell
- Reference
- javascript array
- math font
- number theory
- RUBY
- script
- Vim
- 백준
- JavaScript
- stack
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |