ShellCheck는 bash/sh 셸 스크립트 속 잘못된 코드를 찾아 경고와 수정 제안을 보여주는 정적 분석(static analysis) 도구입니다. 다양한 방식으로 활용할 수 있는데, 웹사이트(https://www.shellcheck.net)에 접속해 자신의 셸 스크립트를 온라인 코드 편집기(Ace – JavaScript로 작성된 독립형 코드 편집기)에 붙여넣어 즉각적인 피드백을 받는 것이 가장 간편한 방법입니다. 이 사이트는 항상 최신 git 커밋과 동기화되어 있어 ShellCheck을 처음 접해보기에 좋습니다.
또는 자신의 머신에 직접 설치해 터미널에서 실행하거나, 텍스트 편집기와 빌드·테스트 스위트에 통합하여 사용할 수도 있습니다.
ShellCheck이 수행하는 세 가지 핵심 기능
- 초보자 문법 오류 지적: 셸이 암호 같은 에러 메시지를 내게 만드는 전형적인 초급 문법 문제를 찾아내고 원인을 설명해 줍니다.
- 중급자 의미론적 문제 지적: 셸이 이상하고 직관에 반하는 방식으로 동작하게 만드는 전형적인 중급 수준의 의미론적(semantic) 문제를 짚어줍니다.
- 잠재적 함정 예측: 숙련된 사용자의 스크립트가 현재는 잘 작동하더라도, 미래의 특정 상황에서 실패할 수 있는 미묘한 주의사항·코너 케이스·함정까지 잡아냅니다.
이 글에서는 리눅스에서 ShellCheck을 다양한 방법으로 설치하고 활용해 셸 스크립트의 버그나 나쁜 코드를 찾아내는 방법을 소개합니다.
리눅스에서 ShellCheck 설치하기
ShellCheck은 배포판의 패키지 관리자를 통해 간단히 설치할 수 있습니다.
Debian/Ubuntu
# apt-get install shellcheck
RHEL/CentOS
# yum -y install epel-release # yum install ShellCheck
Fedora
# dnf install ShellCheck
웹에서 ShellCheck 사용하기
https://www.shellcheck.net에 접속해 제공되는 Ace 편집기에 자신의 스크립트를 붙여넣으면, 편집기 하단에 분석 결과가 표시됩니다.
예를 들어 아래와 같은 테스트용 셸 스크립트가 있다고 가정해 보겠습니다:
#!/bin/bash #변수 선언 MINARGS=2 E_NOTROOT=50 E_MINARGS=100 #변수 값 출력 echo $MINARGS echo $E_NONROOT exit 0;
위 화면에서 볼 수 있듯이, E_NOTROOT와 E_MINARGS 변수는 선언만 되고 사용되지 않았습니다. ShellCheck은 이를 '제안성 오류'로 보고합니다:
SC2034: E_NOTROOT appears unused. Verify it or export it. SC2034: E_MINARGS appears unused. Verify it or export it.
또한 echo $E_NONROOT 구문에서 변수 이름을 잘못 입력했습니다(E_NOTROOT여야 함). 그 결과 다음과 같은 오류가 출력됩니다:
SC2153: Possible misspelling: E_NONROOT may not be assigned, but E_NOTROOT is
마지막으로 echo 명령문의 변수들이 큰따옴표로 감싸져 있지 않습니다(큰따옴표는 globbing과 단어 분리를 방지하는 데 도움이 됩니다). 따라서 다음과 같은 경고가 표시됩니다:
SC2086: Double quote to prevent globbing and word splitting.
터미널에서 ShellCheck 사용하기
커맨드 라인에서도 ShellCheck을 실행할 수 있습니다. 앞서 살펴본 동일한 셸 스크립트를 대상으로 실행해 보겠습니다:
$ shellcheck test.sh
텍스트 편집기에서 ShellCheck 사용하기
다양한 편집기에서 ShellCheck의 경고와 제안을 바로 확인할 수도 있습니다. 파일을 저장할 때마다 코드의 오류를 즉시 보여주므로, 실무에서는 이 방식이 가장 효율적입니다.
Vim에서 설정하기 (ALE 또는 Syntastic)
Vim에서는 ALE 또는 Syntastic 플러그인을 사용할 수 있습니다(여기서는 Syntastic을 사용). 먼저 Syntastic 설치를 쉽게 해주는 Pathogen부터 설치합니다. 아래 명령으로 pathogen.vim 파일과 필요한 디렉터리를 생성하세요:
# mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
다음으로 ~/.vimrc 파일에 아래 한 줄을 추가합니다:
execute pathogen#infect()
Pathogen 설치가 끝나면, 이제 Syntastic을 ~/.vim/bundle 디렉터리에 클론합니다:
# cd ~/.vim/bundle && git clone --depth=1 https://github.com/vim-syntastic/syntastic.git
그런 다음 Vim을 종료했다가 다시 실행해 재로드한 뒤, 아래 명령을 입력합니다:
:Helptags
모든 과정이 정상적으로 완료되면 ShellCheck이 Vim에 통합됩니다. 아래 스크린샷은 앞서 사용한 동일한 스크립트로 동작하는 모습입니다.
위 단계를 수행한 후에도 오류가 발생한다면 Pathogen이 올바르게 설치되지 않았을 가능성이 큽니다. 다음 사항을 확인하며 단계를 다시 진행해 보세요:
- ~/.vim/autoload와 ~/.vim/bundle 디렉터리 두 개가 모두 생성되었는지 확인
- ~/.vimrc 파일에 execute pathogen#infect() 라인이 추가되었는지 확인
- Syntastic이 ~/.vim/bundle 안에 git clone 되었는지 확인
- 위 디렉터리들에 적절한 접근 권한이 부여되었는지 확인
다른 편집기에서 활용하기
Vim 외에도 다른 편집기에서도 ShellCheck 연동을 통해 셸 스크립트의 나쁜 코드를 검사할 수 있습니다:
- Emacs: Flycheck 사용
- Sublime Text: SublimeLinter 사용
- Atom: Linter 사용
- 기타 대부분의 편집기: GCC 오류 호환 형식 활용
참고: ShellCheck GitHub 저장소에 공개된 'bad code 갤러리'를 활용하면 더 다양한 사례로 검사 능력을 시험해볼 수 있습니다.
ShellCheck GitHub 저장소: https://github.com/koalaman/shellcheck
마무리
지금까지 리눅스에서 ShellCheck을 설치하고, 웹·터미널·텍스트 편집기 등 다양한 환경에서 활용해 셸 스크립트의 버그나 나쁜 코드를 찾아내는 방법을 알아보았습니다. 사용 후기나 궁금한 점은 댓글로 공유해 주세요.
혹시 ShellCheck 외에 비슷한 용도의 다른 도구를 알고 계신가요? 알고 계신 도구 정보도 댓글로 남겨주시면 많은 분들에게 도움이 될 것입니다.