본문 바로가기

IT

[Ubuntu/Linux] 본쉘(Bourne shell)에 없는 것과 있는 것

유닉스 역사로 따지자면, 쉘은 태고적부터 존재하였습니다.

그 이후 쉘은 필요에 따라- 쓰임에 따라- 다양한 모습으로 진화하였습니다.

bash, ash, csh, ksh, tcsh, zsh, ...

적자생존에서 살아남은 쉘도 있고 이제는 기억에서만 희미하게 남은 쉘도 있습니다.


그 중에서 태초부터 존재하였던 Bourne shell에 대해 몇 가지 이야기를 해보려고 합니다.

1969년 탄생한 유닉스 보다 한 발 늦은 1974년에 나왔지만,

이제는 검은 터미널에 흰 글씨 자체가 유닉스 계열의 얼굴이 되었지요.

 

 

shell을 먼저 영어사전에서 찾아보겠습니다.

 

'껍데기'

알맹이인 운영체제와 사용자가 만나는 곳이 껍데기, 곧 쉘입니다.

어려운 신조어를 사용하지 않고 핵심개념으로 쉘을 작명한 센스가 엿보입니다.

 

쉘은 전통적으로 Unix 계열의 운영체제에서 운영체제와 사용자가 소통하는 공간이었습니다.

1974년에 Stephen Bourne이 만든 이래에 2015년 현재까지 사용되고 있습니다.

40년이 넘도록 사랑받고 있는 몇 안되는 프로그램이지요.

이후 다양한 쉘이 나오면서 처음 나온 쉘은 자연스럽게 개발자 이름을 따서 본쉘이라고 부르게 되었습니다.

(Bourne쉘 보다는 '本'쉘(근본이 되는 쉘)로 이름을 잊지 않으려고 했던 기억이 나네요.)


고령인 본쉘은 이후 시대에 나온 쉘과는 몇가지 차이가 있습니다.

이후 시대에 나온 쉘이 본쉘에서 제공하지 않는 기능을 추가한 셈이지요.

본쉘에 없는 기능을 하나씩 되짚어 보겠습니다.


- 자동완성기능 : 터미널에서 '탭'으로 디렉토리/파일명을 완성하는 기능

   터미널을 사용하며 자동완성기능을 수없이 사용하고 있습니다.

   디렉토리 경로나 파일명을 외울 필요 없이 두어글자만 치고 탭을 누르면 자동으로 완성되지요.

   하지만, 이렇게 편리한 기능이 애초에 있었던 것은 아닙니다.

   본쉘에서는 정확한 경로명과 파일명을 직접 입력해야 명령을 수행할 수 있었습니다.

   기다란 경로와 파일명을 타이핑했는데 오타가 있어서 실행이 안되는 경우가 빈번하였겠죠.

   이런 짜증나는 무수한 상황들이 '자동완성기능'을 낳았습니다.


- 명령라인 수정기능 : 방향키를 이용하여 좌우로 이동&수정하는 기능

   'Hell world' 문장을 적다가 'o'를 빼먹었다면 좌우 커서로 'o'가 있는 자리로 돌아가서 수정할 수 있습니다.

   하지만, 본쉘에서는 문장 중간으로 돌아가 알파벳을 더하거나 뺄 수 없었죠.

   애당초 그 시대에는 방향키조차 없었어요.

   그래서 이후에 나온 쉘들은 키조합으로 명령라인 수정기능을 제공하였습니다.

   Ctrl - B는 이전으로 커서이동, Ctrl - F는 다음으로 커서이동하도록 기능이 추가되었죠.

   상대적으로 최근에 나온 쉘들은 방향키로 이동이 가능하지요.


- 명령 히스토리 : 쉘에서 사용한 명령어 관리

   커맨드 라인에서 history를 치면 그 동안 사용한 명령어가 나옵니다.

   상당히 유용한 기능입니다.

   history를 보고 이전에 사용한 명령어를 바로 실행할 수도 있습니다.


- 잡 컨트롤 : 백그라운드 프로세스를 관리하는 기능

   ps / kill / jobs / bg / fg와 같은 백그라운드 프로세스를 관리하는 툴이 미비하였습니다.

   현재에 이르러서 이러한 기능들은 너무나 유용하기 때문에,

   태초의 본쉘을 제외하고 대부분의 다른 쉘들은 대부분 탑재하고 있습니다.


위에 적혀있는 기능들은 본쉘에 '탑재되지 않은' 기능 중에 대표적인 미탑재 기능입니다.

현대에 사용하는 쉘에서는 어느 하나 놓치기 어려운 기능입니다.


                      Bourne  C    TC   Korn   BASH                         sh   csh  tcsh   ksh   bash ______________________________________________________ Programming language   Yes  Yes   Yes   Yes   Yes Shell variables        Yes  Yes   Yes   Yes   Yes Command alias          No   Yes   Yes   Yes   Yes Command history        No   Yes   Yes   Yes   Yes Filename completion    No   Yes*  Yes   Yes*  Yes Command line editing   No   No    Yes   Yes*  Yes Job control            No   Yes   Yes   Yes   Yes ______________________________________________________

* Reference : http://www.cis.rit.edu/class/simg211/unixintro/Shell.html


그렇다면 본쉘이 한 것은 무엇일까요?

하지 않은 것 외에는 전부 다 해놓았습니다.

본쉘은 모든 쉘의 토대가 되는 기본 원칙을 '아주' 견고하게 다져 놓았습니다.

'단순하지만, 강력하게' 동작하도록.


- 프롬프트

   프롬프트는 쉘이 보여주는 시작이자 끝입니다.

   본쉘에서 이 시작과 끝을 다 만들어놓았습니다. :)

   Current working directory를 알 수 있고, 프롬프트 모양으로 root와 일반 사용자 구분할 수도 있습니다.

   본쉘에서부터 프롬프트의 모양으로 root와 일반 사용자를 구분지었습니다.

   '#'는 루트권한을 가진 사용자에게만 적용하고,

   '$'는 일반 사용자에게 노출하였습니다(csh과 tcsh은 '%').

   이 부분은 그 때나 지금이나 동일합니다.

   이는 사소한 예일지는 모르겠으나 수많은 유닉스 계열 사용자를 '길들였습니다'.


- 스크립트

   쉘 스크립트에 대해서는 차차 포스팅하겠습니다.

   본쉘에서 이룩한 토대를 보면, 여지껏 본쉘이 살아남은 이유를 실감할 수 있을 겁니다.

   본쉘 이후 등장한 쉘들은 저마다 새로운 syntax가 추가하여 본쉘과 호환되지 않는 문법도 생겼습니다만,

   본쉘에서 제공하는 스크립트만으로도 충분히 강력한 기능을 수행할 수 있습니다.


- 수행기본단위

   쉘은 '줄'단위로 해석하여 명령을 수행합니다.

   프롬프트에서 명령을 읽을 때도,

   스크립트파일을 열어 읽을 때도 한 줄씩 받아 읽습니다.

   한 줄이 하나의 완결된 동작이지요.

   지금에서야 아주 당연한 모습일 수도 있지만,

   이러한 '제한'이 '규약' 혹은 '원칙'이 되어 광범위하게 쓰이게 되었습니다.


스크립트 문법은 차차 살펴보도록 하겠습니다.

웹에 좋은 자료들이 많기 때문에 기존과 똑같은 방법으로 지식을 나열하는 것은 의미가 없어보이네요.

나름의 방법을 찾아봐야겠습니다.


그럼 좋은 하루 보내세요~

끝_


* References

https://en.wikipedia.org/wiki/Bourne_shell

http://www.linfo.org/shell.html

http://www.grymoire.com/Unix/Sh.html#uh-3

http://www.cis.rit.edu/class/simg211/unixintro/Shell.html