이번 챕터에서는 리눅스 시스템 프로그래밍에 대한 다양한 개념이 소개되어 있다.
직전 포스팅 내용이 커널에 관한 내용이라면 이번에는 쉘(shell)에 관한 내용이다.
쉘(shell)은 사용자가 친 명령어를 읽고, 그에 따른 적절한 프로그램을 실행하도록 디자인 된 특수한 프로그램이다.
"명령 인터프리터 (command interpreter)" 라고 일컫기도 함.
UNIX 시스템 상에서 쉘은 커널의 한 부분이 아니라, 하나의 사용자 프로세스 (user process) 이다. 그렇기 때문에 다양한 쉘이 존재하며, 사용자들은 하나의 컴퓨터에서 동시에 여러 종류의 쉘을 사용할 수 있다.
Bourne shell (sh)
가장 널리 쓰이는 쉘 중이 가장 오래된 버전. Steve Bourne에 의해 작성되었다. I/O redirection, pipelines, filename generation, variables, 환경변수, 백그라운드 실행, 함수 등을 제공한다.
C shell (csh)
Bill Joy에 의해 작성되었다. C의 control-flow와 비슷한 제어 구조를 가지고 있는 쉘이다. command history, command-line editing, alias 등을 제공한다.
Korn shell (ksh)
Bourne shell의 계승판 느낌. David Korn에 의해 작성되었다. Bourne shell의 호환성을 유지하면서 C shell의 기능과 유사한 기능을 합쳤다.
Bourne again shell (bash)
GNU project의 Bourne shell 재구현작. C와 Korn shell의 기능들을 제공하며 Linux에서 가장 널리 쓰이는 쉘이 되었다. (리눅스에서 sh 인 것은 사실은 bash 이며, 최대한 sh에 가깝게 구현되었다.)
이러한 쉘 들은 컴퓨터와 사용자의 상호작용 용도로만 디자인 된 것이 아니라, 쉘 스크립트(shell script) 라는 텍스트 파일 역시 읽어들여 동작하게 디자인 되었다. 이러한 목적 때문에, 각 쉘에는 변수, 루프 및 조건문, I/O 명령 및 함수와 같이 일반적으로 프로그래밍 언어와 관련된 기능이 존재한다.