본문 바로가기

IT

[Ubuntu/Linux] #!/bin/sh에 대한 간단한 이야기

우분투로 작업을 하다보면 필연적으로 쉘스크립트를 마주하게 됩니다.

쉘스크립트 파일을 열어보면 첫번째 줄에 주석 비스무레한 것이 있지요.

'#'으로 시작하기 때문에 주석처럼 보이는 것인데요,

'#'에 '!'가 연달아 나오는 "#!"는,

스크립트를 실행할 쉘을 지정하는 선언문입니다.

여기까지만 알아도 개발하는데 지장은 '거의' 없습니다.



우분투 15.04에서 눈에 띄는 스크립트를 하나 열어보았습니다.

첫번째 줄에는 어김없이 스크립트를 실행할 쉘이 명시되어 있습니다.

대다수의 스크립트는 이처럼 "/bin/sh"을 바라보고 있죠.


"/bin/sh"이 무엇인지 시스템에서 확인해보시죠.

$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4  6월 30 19:44 /bin/sh -> dash


우분투 15.04에서는 "/bin/sh"은 dash 쉘에 링크를 걸어두고 있습니다.

스크립트를 실행하면, "/bin/sh"에 연결된 dash 쉘의 도움을 받게 되겠지요.


그 동안 리눅스 배포판에서는 bash 쉘을 오랜 기간 사용했습니다.

bash 쉘의 풍부한 기능과 다양한 문법 지원이 많은 개발자들에게 어필하였습니다.


하지만, 우분투 6.06 버전에서 bash를 dash로 전격 교환하였습니다.

곧, "/bin/sh -> bash" 에서 "/bin/sh -> dash"로 변경된 것이지요.


그렇다면, bash 쉘은 더 이상 사용하지 않는 것일까요?

'다행스럽게도' 아직 명맥을 유지하고 있습니다.

$ ls -la /bin/bash 
-rwxr-xr-x 1 root root 1029720 10월 29  2014 /bin/bash


여러가지 이유가 있겠지만,

- 상당 수 스크립트가 아직 "#!/bin/bash"를 달고 있고,

- 로그인은 dash 대신 bash 쉘을 사용하기 때문입니다.

터미널을 열어 ps를 확인해보면, bash가 떠 있는 것을 확인하실 수 있습니다.

$ ps -ef | grep bash
storyco+  1841  1828  0 23:07 pts/4    00:00:00 bash

1841번 프로세스를 죽이면, 당연히 열어놓은 터미널이 사라지겠지요.


그렇다면, 언제는 dash를 사용하고, 또 언제는 bash를 사용하는 것일까요?

bash가 풍부한 기능과 다양한 문법을 지원한다고 초반에 언급했는데요,

바로 거기에 힌트가 있습니다.

기능이 많아지면 필연적으로 성능은 떨어질 수밖에 없습니다.

간단한 스크립트의 실행은 bash나 dash나 비슷하겠지만,

빌드 스크립트와 같이 복잡다단한 스크립트를 실행하게 되면 쉘 간에 속도 차이가 확연하게 나타납니다.

따라서 상대적으로 가벼운 dash를 스크립트 실행에 사용하게 되었습니다.


그렇다면, 왜 로그인 쉘은 bash를 사용하는 것일까요?

이 역시 bash 쉘의 풍부한 기능으로 설명하면 되겠네요.

제가 bash 쉘에서 자주 사용하는 기능 중에 history 명령어가 있습니다.

옵션까지 주룩 나열된 명령어를 다시 치지 않고 history를 확인하여 한 번에 실행하곤 합니다.

이 명령어는 bash에만 탑재된 기능입니다.

dash는 가벼운 대신 사용자 interaction할 수 있는 기능이 거의 없습니다.

따라서 로그인쉘로 bash가 살아남게 되었습니다.


아래처럼 passwd 파일을 살펴보면,

로그인 쉘로 bash를 택한 것을 볼 수 있습니다.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

bash와 dash 간에 상당한 차이가 존재합니다.

bash에서 사용하던 스크립트가 dash에서는 지원하지 않아 에러를 뱉어낼 수 있습니다.

실제로 bash를 겨냥하여 많은 대다수의 스크립트들이,

dash에서 제대로 동작하지 않아 버그를 낳게 되었습니다.

이는 dash를 선택한 데비안/우분투 진영에서 풀어야할 숙제입니다.


그럼 좋은 하루 보내세요~

끝_


* References

http://askubuntu.com/questions/141928/what-is-difference-between-bin-sh-and-bin-bash

http://coffeenix.net/doc/shell/introbashscript.htm