셸은 운영체제의 서비스를 사용자나 응용프로그램에게 노출시키는 프로그램입니다.
셸은 껍데기라는 뜻이며, 운영체제의 커널을 감싸는 바깥쪽 레이어기 때문에 셸이라는 이름을 사용합니다.
커널
커널은 운영체제의 핵심이자 기반인 프로그램으로, 운영체제 그 자체라고 할 수 있습니다.
커널은 하드웨어를 직접 제어하며, 사용자와 응용 프로그램에게는 운영체제 서비스를 제공합니다.
부트로더를 제외하면, 커널은 가장 먼저 로드되는 프로그램입니다. 커널에서 중요한 부분들은 운영체제를 사용하는 동안 항상 메모리에 로드되어있고, 응용프로그램이 접근할 수 없도록 분리된 메모리 영역에 로드되어있습니다.
커널은 CPU, 메모리 등 하드웨어를 직접 상호작용합니다. 따라서 커널은 매우 저수준의 계층이며, 일반 사용자나 응용프로그램이 직접 접근할 수 없도록 구성됩니다.
물론 Exokernel 엑소커널과 같이 응용프로그램이 하드웨어 자원을 비교적 더 직접적으로 접근할 수 있게 커널을 설계하는 종류도 존재하지만 일반적이지 않습니다.
커널이 하는 일 중 하나는 여러 작업들을 분할하여 CPU에 효율적으로 할당하는 스케줄링입니다. 일반 사용자나 응용소프트웨어 단계에서 커널 또는 하드웨어 수준까지 내려가서 CPU를 직접 제어하는 건 쓸데없이 복잡하고 아무런 장점이 없죠.
셸
하지만 우리 인간 사용자나 응용프로그램들은 커널의 기능 또는 운영체제의 서비스들을 제공받아서, 하드웨어의 자원을 할당받고 프로그램을 실행하고 문제를 풀어야합니다.
따라서 사용자나 응용프로그램은 셸을 통해 커널을 사용합니다. 우리는 셸을 통해 운영체제의 서비스를 제공받고, 간접적으로 하드웨어를 제어합니다.
셸의 인터페이스
셸은 두가지 종류의 인터페이스로 사용할 수 있습니다.
- GUI(그래픽 유저 인터페이스) 셸
윈도우의 탐색기와 맥의 파인더가 GUI 셸 입니다. 파인더를 통해 우리가 파일을 옮기는 것은, GUI 셸을 통해 운영체제의 커널이 제공하는 파일 서비스들을 사용하는 것입니다.
- CLI(커맨드 라인 인터페이스) 셸
명령어 텍스트를 통해 상호작용하는 인터페이스로 셸을 사용할 수 있습니다. GUI가 보급되기전 콘솔 또는 터미널을 통해 텍스트로 컴퓨터를 제어하던 프로그램이 CLI 셸입니다.
- 터미널 Terminal 은 끝지점을 뜻하는 종점이나 종단 또는 단말 이라는 뜻을 가진 영어단어입니다(종종 단말기라고 번역됩니다). 컴퓨터 시스템의 가장 끝지점에서 사용자를 만나는 하드웨어이기 때문에 그러한 이름이 붙었습니다.
대표적인 CLI 셸로는 리눅스에서 주로 사용하는 bash, 맥에서 주로 사용하는 zsh, 윈도우에서 주로 사용하는 파워 셸이 있습니다.
터미널 에뮬레이터
CLI 셸들은 터미널이라고 부르는 프로그램을 통해 사용할 수 있습니다. 예를 들어 윈도우의 파워셸은 윈도우 콘솔을 통해 실행할 수 있고, 맥에서 zsh은 터미널을 통해 실행할 수 있습니다.
여기서 macOS의 터미널은 셸 그 자체가 아니라, zsh이라는 셸 프로그램을 사용하게 해주는 인터페이스 프로그램입니다.
과거에는 하드웨어인 콘솔 또는 터미널 통해 셸을 사용했습니다. 이들은 GUI를 거치지 않고 바로 화면에 커맨드 라인 인터페이스를 출력했습니다.
현대 컴퓨터는 GUI로 동작하고, 터미널 프로그램들은 GUI 위에 실행되므로, 우리가 사용하는 터미널 앱은 정확하게는 터미널 에뮬레이터 입니다.
macOS의 터미널이나 윈도우의 윈도우 콘솔은, GUI가 없던 시절의 터미널을 GUI 창 위에 에뮬레이션으로 표현하는 것입니다. 다만 간편하게 부르기 위해 터미널 에뮬레이터를 터미널이라고 부릅니다.