Bash

Bash is the GNU Project's shell.

— GNU 공식 홈페이지

"분명히 겉보기엔 똑같은 따옴표인데 왜 문법 에러가 나는 거지?" 띄어쓰기 한 칸 잘못 했다고 프로덕션 데이터베이스를 날려먹을 뻔했습니다.1

1. 개요

리눅스와 유닉스 계열 운영체제의 사실상 표준(De facto standard)이자 공기 같은 존재인 명령 줄 인터페이스이다. 스티븐 본이 만든 오리지널 본 셸을 완전히 계승하고 발전시킨 GNU 프로젝트의 핵심 역작이다. 전 세계 대부분의 리눅스 배포판에서 기본 셸로 채택되어 왔으며, 맥 OS가 Zsh로 이탈하기 전까지는 맥에서도 표준이었다. 인공호흡기만 붙여놓은 듯한 구시대적 문법을 고수하고 있지만, 도커 컨테이너의 내부 진입점(Entrypoint)부터 시작해서 인프라 CI/CD 배포 스크립트까지 안 쓰이는 곳이 없는 현대 서버 환경의 절대적인 지배자이다.

2. 문법적 기괴함과 한계

배시의 문법은 타 프로그래밍 언어의 유연함에 길들여진 현대 개발자들에게 엄청난 문화 충격을 선사한다. 단적으로 조건문을 비교할 때 쓰는 [ 가 단순한 문법 기호가 아니라 실제 /usr/bin/[ 이라는 독립된 명령어라는 사실부터 골치가 아파지기 시작한다.(...) 이 때문에 대괄호 양옆에 반드시 스페이스 한 칸의 공백을 두어야 하며, 이를 무시하면 무참한 구문 에러가 발생한다. 또한, 에러가 발생해도 스크립트가 멈추지 않고 그대로 끝까지 실행되는 기본 속성 때문에 프로덕션 환경의 디렉터리를 지워버리는 대형 사고가 잦아, 실무에서는 반드시 스크립트 최상단에 set -eset -uo pipefail 같은 안전 패러독스 옵션을 떡칠해두는 것이 정석으로 통한다.

3. 현대적 위상과 레거시의 생명력

Zsh나 Fish 같은 강력한 오토 컴플릿과 풍부한 테마를 지원하는 모던 셸들이 개발자들의 로컬 터미널 환경을 잠식했음에도 불구하고, 실제 실무 배포 환경에서는 여전히 배시가 요지부동의 1위를 지키고 있다. 도커 이미지의 용량을 단 1MB라도 줄이기 위해 최소한의 실행 바이너리만 남겨두는 컨테이너 생태계에서, 배시는 가벼움과 안정성이라는 압도적인 깡패 스펙을 무기로 서버 백엔드를 영원히 통제하고 있기 때문이다. 결국 로컬에서는 화려한 우주선 셸을 쓰던 개발자들도, 실제 빌드 스크립트나 인프라 파이프라인을 짤 때는 경건한 마음으로 배시를 붙잡고 문법 오류 구글링을 반복하게 된다.

4. 관련 밈 및 드립

4.1. rm -rf /

모든 리눅스/배시 입문자가 한 번쯤은 들어봤거나 실제로 쳐봤을 전설의 명령어. 루트 디렉터리 이하의 모든 파일을 경고 없이 날려버리는 파괴적인 명령어다. 현대 배시에서는 --no-preserve-root 옵션을 넣지 않으면 실행되지 않도록 막아두는 안전장치인 세이프가드가 추가되었으나, 과거에는 영혼까지 털리기에 딱 좋은 트리거였다.(...) 서버 엔지니어 신입 사원 면접에서 '가장 기억에 남는 명령어'로 꼽히며, 실제로 사내 메인 데이터베이스를 날려먹고 커리어가 폭발했다는 전설적인 실화들이 주기적으로 발굴되곤 한다.

4.2. 띄어쓰기 빌런

배시 스크립트에서는 if [ $a = $b ]처럼 조건식 대괄호 주변에 반드시 공백을 둬야 한다. 만약 if [$a=$b]로 쓰면 배시는 대괄호 자체를 명령어로 인식하여 Syntax Error를 뿜어낸다. 변수 할당 시에도 VAR = "value"로 공백을 주면 VAR라는 명령어를 찾을 수 없다는 기상천외한 에러를 만난다.(...) 타 프로그래밍 언어의 유연한 포맷터에 익숙해진 현대 개발자들의 뒷목을 잡게 만드는 배시만의 악마적인 규칙 중 하나다.

5. 여담

  • 이름의 언어유희: 'Bourne Again Shell'은 유닉스의 전설적인 셸인 'Bourne Shell'의 이름을 따서 지어진 것이면서, 동시에 기독교의 '거듭남(Born Again)'을 패러디한 고도의 아재 개그다.(...)
  • macOS와의 결별: 애플macOS Catalina부터 기본 셸을 배시에서 Zsh로 변경했다. 표면상 이유는 Zsh의 편의성이었으나, 실질적으로는 배시가 GPLv3 라이선스를 채택하면서 애플이 소스 코드 공개 의무 등의 법적 리스크를 피하기 위해 라이선스가 더 널널한 MIT/BSD 계열의 Zsh로 도망친 것이 정설이다.2
  • 윈도우에서의 침공: 마이크로소프트가 WSL을 전격 지원하면서, 이제 윈도우 환경에서도 파워셸을 켜는 대신 배시를 띄워 리눅스 유틸리티를 돌리는 풍경이 일상화되었다.

6. 관련 문서

각주

  1. 실제로 if 조건절이나 변수 대입에서 띄어쓰기 한 칸 잘못 쓰면 조건문 평가가 통째로 우회되거나 원치 않는 디렉터리가 삭제되는 참사가 발생한다. 진짜로 죽을 수 있다.

  2. 애플은 한동안 배시의 구버전(GPLv2였던 3.2 버전)을 악착같이 유지하며 버텼으나, 보안 취약점 패치 한계에 다다르자 결국 항복하고 Zsh로 갈아탔다.