리눅스에서 bash 셸을 사용하며 만족하고 계신가요? 아니면 새로운 대안을 찾고 계신가요? tcsh, fish, KornShell, Z Shell 등 다양한 선택지가 있습니다. 그렇다면 이 인기 리눅스 셸들 중 어느 것이 가장 뛰어날까요?
리눅스 셸이란 무엇인가?
일반적으로 애플리케이션을 개발할 때는 C#, Java, C++처럼 사람이 이해할 수 있는 고급 언어를 사용합니다. 하지만 놀랍게도 컴퓨터는 모든 것을 0과 1, 즉 흔히 말하는 바이너리 또는 기계어로만 인식합니다.
컴파일러는 고급 언어로 작성된 코드를 실행 파일과 같은 바이너리 형태로 변환합니다. 우리가 애플리케이션을 실행할 때 사용하는 것이 바로 이 바이너리 파일입니다.
물론 이것은 아주 단순화된 설명입니다. 핵심은 컴퓨터에 번역 계층이 필요하다는 점입니다. 이 계층은 사람이 내린 명령을 컴퓨터가 이해할 수 있는 방식으로 연결해 줍니다.
셸은 '인터프리터'라고 불립니다. 컴파일러와 마찬가지로 인터프리터도 사람이 작성한 코드를 기계어로 번역하지만, 차이점이 있다면 인터프리터는 한 문장씩 순차적으로 처리한다는 점입니다. 반면 컴파일러는 프로그램 전체를 스캔해 한꺼번에 기계어로 변환합니다.
즉, 셸은 운영체제(OS)와 상호작용하기 위한 인터페이스입니다. 사용자가 명령어를 입력하면 셸이 이를 해석해 실행합니다. 파일 복사, 파이핑, 파일 목록 조회 같은 작업이 모두 셸의 역할 범위에 속합니다.
여러 종류의 리눅스 셸을 사용할 수 있습니다. 시스템에서 사용 가능한 모든 셸을 확인하려면 터미널을 열고 다음을 입력하세요:
cat /etc/shells
현재 사용 중인 셸을 확인하려면 다음을 입력하세요:
echo $0
그렇다면 지금 사용 중인 셸이 최선의 선택일까요? 사용 가능한 셸들을 하나씩 살펴보겠습니다.
1. Bash
Bash(Bourne-Again Shell)는 리눅스 사용자들 사이에서 압도적으로 가장 인기 있는 셸입니다. 많은 리눅스 배포판이 bash를 기본 셸로 탑재하는데, bash가 GNU의 기본 셸이기 때문입니다. 1989년에 출시되어 수십 년간 꾸준히 발전해 왔습니다.
Bash의 전신은 유닉스 초기 셸 중 하나인 Bourne Shell(sh)입니다. sh 프로그래머에게 매력적인 점은 자신의 스크립트를 수정 없이 그대로 bash에서 사용할 수 있다는 것이었습니다. 또한 bash는 전신 대비 여러 기능이 강화되었습니다:
- 명령어 자동 완성
- 명령어 히스토리
온라인의 대부분 문서와 튜토리얼은 독자가 bash를 사용한다고 가정합니다. 다만 bash가 완벽한 것은 아닙니다. bash 스크립트를 작성해 본 사람이라면 누구나 공감하겠지만, 문제는 '불가능하다'가 아니라 읽고 쓰기에 항상 우아하지는 않다는 점입니다.
2. KornShell
흔히 ksh라고 불리는 KornShell은 1980년대 벨 연구소(Bell Labs)에서 탄생한 인기 리눅스 셸입니다. bash와 ksh 사이에는 큰 차이가 없지만, 각각 나름의 장점이 있습니다. 예를 들어 ksh에는 cd old new 명령이 있습니다. /Downloads/foo/bar/one/foobar 디렉터리에서 /Downloads/foo/bar/two/foobar 디렉터리로 이동하려면 다음만 입력하면 됩니다:
cd one two
ksh 베테랑들은 스크립팅 관련 장점을 근거로 ksh의 우수성을 주장합니다. 주요 장점은 다음과 같습니다:
- 더 깔끔한 반복문 문법
- 명령 반복의 직관적 처리
- 연관 배열(Associative Arrays) 지원
bash와 달리 ksh는 온라인에서 도움 자료를 찾기 어려운 편입니다. ksh를 직접 사용해 보려면 다음을 입력하세요:
sudo apt install ksh
ksh
3. Tcsh
Tcsh의 뿌리는 유닉스 초창기까지 거슬러 올라갑니다. C 셸(csh)의 개선 버전으로, 다음과 같은 기능을 제공합니다:
- 프로그래밍 가능한 명령줄 자동 완성
- 명령줄 편집 기능
- 별칭(alias)에 인수 추가
- 손쉬운 명령 히스토리 접근
표시된 히스토리에서 해당 번호 n을 넣어 !n을 입력하면 어떤 명령이든 실행할 수 있습니다. tcsh의 히스토리 탭 완성은 다음과 같이 사용합니다:
!a<TAB>
이렇게 입력하면 "a"로 시작하는 마지막 명령으로 확장됩니다. 참고로 bash에서는 !a:p를 입력해 먼저 명령을 확인한 후 !!를 입력해 실행해야 합니다.
tcsh를 사용해 보려면 다음을 입력하세요:
sudo apt install tcsh
tcsh
Tcsh는 FreeBSD 같은 BSD 계열 시스템의 기본 셸입니다. tcsh의 가장 큰 매력은 스크립팅 언어로, 주로 C 언어로 프로그래밍하는 개발자에게 유용합니다. 덕분에 C 문법과 셸 스크립트 사이를 오가며 헷갈리기 쉬운 괄호 종류 같은 문제 없이 소규모 C 프로그램을 빠르게 프로토타이핑할 수 있습니다.
4. Fish
진지함이 특징인 리눅스 세계에서 fish 팀은 프로젝트에 유머를 담았습니다. fish("friendly interactive shell", 친절한 대화형 셸)는 2005년에 개발되었지만, 웹사이트에는 "드디어 90년대를 위한 커맨드 라인 셸이 나왔다"는 재치 있는 문구가 적혀 있습니다. 화려한 VGA 색상 지원 외에도 다른 셸 대비 여러 개선점이 있습니다:
- 잘못된 문법의 명령은 빨간색으로 표시
- 올바른 문법은 파란색으로 표시
- 자동 완성 제안 기능
- 시스템의 man 페이지 기반 명령 완성
이 기능은 새로 설치한 소프트웨어의 man 페이지에 있는 문법을 자동 완성 제안에 추가해 줍니다. 커맨드 라인에 익숙해지고 싶다면 fish가 훌륭한 출발점이 될 수 있습니다.
fish를 체험해 보려면 다음을 입력하세요:
sudo apt install fish
fish
5. Z Shell
마지막까지 최고의 셸을 남겼다고 생각하는 사람들이 많으며, 그럴 만합니다. Zsh는 bash 및 ksh와 유사하면서 두 셸의 기능과 tcsh의 기능까지 폭넓게 통합했습니다. Zsh의 주요 기능은 다음과 같습니다:
- 탐색 가능한 자동 완성 목록
- 뛰어난 맞춤법 교정
- 명령줄 완성
- 터미널 간 히스토리 공유
- Globbing(파일명 와일드카드 문자)
Zsh의 globbing은 매우 유용합니다. 다음과 같이 입력하면:
vim /u/l/b/a<TAB>
아래 파일이 열립니다:
/usr/local/bin/autoupdate.sh
Zsh는 기본 설정을 사용하지 않으면 처음 설정하는 데 시간이 걸릴 수 있습니다. 사용해 보려면 다음을 입력하세요:
sudo apt install zsh
zsh
나에게 맞는 리눅스 셸은 무엇일까?
이렇게 다양한 선택지가 존재한다는 사실 자체가 멋진 일입니다. 각 셸은 프로그래머들이 자신만의 방식으로 일하고 싶었던 컴퓨팅 역사의 한 조각이기 때문입니다.
셸 간의 실질적인 차이는 스크립팅 문법에서 드러납니다. 각 셸마다 고유한 뉘앙스가 있어 서로 구별됩니다. 현재 시장 점유율에서 bash가 압도적이어서 문제 해결에 도움을 받기가 훨씬 쉽습니다. 결국 bash가 가장 뛰어난 만능 셸이라 할 수 있으며, 가장 진보적인 사용자를 제외한 거의 모든 요구를 충족합니다.
리눅스 셸을 정했다면, 셸 스크립팅의 기본기를 확실하게 익혀두는 것도 잊지 마세요.