# Shellcheck이 여러분의 쉘 스크립트에서 버그를 찾아냅니다

> Clean Markdown view of GeekNews topic #12022. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=12022](https://news.hada.io/topic?id=12022)
- GeekNews Markdown: [https://news.hada.io/topic/12022.md](https://news.hada.io/topic/12022.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2023-11-25T10:09:54+09:00
- Updated: 2023-11-25T10:09:54+09:00
- Original source: [shellcheck.net](https://www.shellcheck.net/)
- Points: 5
- Comments: 1

## Topic Body

### ShellCheck 소개

- ShellCheck는 쉘 스크립트의 버그를 찾아주는 도구임.
- 로컬 환경에서 cabal, apt, dnf, pkg, brew를 통해 설치 가능함.
- 스크립트를 붙여넣으면 ShellCheck가 분석 결과를 출력함.

### ShellCheck의 특징

- ShellCheck는 GPLv3 라이선스로 자유롭게 사용할 수 있음.
- ShellCheck Wiki에 문서화되어 있고, GitHub에서 소스 코드를 확인할 수 있음.
- 대부분의 배포판이나 패키지 매니저에서 이미 패키징되어 있음.
- 주요 에디터에서 통합된 린터로 지원되며, CodeClimate, Codacy, CodeFactor를 통해 GitHub 저장소의 코드를 자동으로 검사할 수 있음.
- Haskell 언어로 작성되었으며, 이에 관심이 있는 사용자에게 적합함.

### 감사의 말

- GitHub Sponsors에 대한 특별한 감사를 표함: Gitpod, Mercedes-Benz, BashSupport Pro, per1234, WhitewaterFoundry, cavcrosby, dcminter, photostructure, Cronitor, djdefi, steve-chavez 등.

### GN⁺의 의견

- 이 기사에서 가장 중요한 것은 ShellCheck가 쉘 스크립트의 버그를 찾는 데 유용한 도구라는 점임.
- ShellCheck는 무료이며, 다양한 플랫폼과 에디터에서 지원되고, 사용하기 쉬운 점이 사람들에게 흥미로울 수 있음.
- 특히, 오픈 소스 커뮤니티의 지원과 Haskell 언어로 개발되었다는 점이 소프트웨어 개발자들에게 매력적으로 다가갈 수 있음.

## Comments



### Comment 20895

- Author: neo
- Created: 2023-11-25T10:09:55+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=38396345) 
- **스크립트 작성 시 주의사항**
  - `-u` (nounset) 옵션을 사용하여 선언되지 않은 변수 사용 시 오류 발생을 권장함. 배열 확장 시 빈 배열이 unbound로 간주되는 경우가 예외임.
  - `-n` (noexec) 옵션을 사용하여 명령어 실행을 방지하는 가짜 실행(dry-run)을 시도할 수 있음.
  - `-e` (errexit) 옵션도 유용하지만, 실패한 "naked" 명령어만 종료를 유발한다는 점을 주의해야 함. 이를 피하기 위해 명령어에 `|| fail "..."`를 추가하는 것을 선호함.

- **쉘 스크립트의 취약점 발견**
  - 산술 확장을 통한 권한 상승 취약점을 발견함. 예를 들어, `$((1 + ENV_VAR))`를 통해 $ENV_VAR을 제어할 수 있다면 코드를 주입할 수 있음.
  - Shellcheck는 기본 설정으로는 이를 잡아내지 못함. 보안에 중요한 기능을 구현할 때는 쉘을 사용하지 않는 것이 좋음.

- **Shellcheck와 strictbash**
  - Shellcheck는 매우 유용함.
  - strictbash는 스크립트를 실행하기 전에 Shellcheck을 실행하는 래퍼(wrapper)로, 오류가 있으면 스크립트를 실행할 수 없게 함. 또한 모든 Bash "strict mode" 플래그를 설정함.

- **Shellcheck에 대한 언급**
  - Shellcheck에 대한 많은 언급이 있으며, 마지막 대규모 토론은 2021년에 있었음.

- **Haskell과 Turtle 사용**
  - Haskell을 사용하여 Turtle 라이브러리와 함께 배포 스크립트를 변환함으로써 중복을 크게 줄임.
  - 결과적으로 코드가 훨씬 짧아짐.

- **Shellcheck와 linters의 사용**
  - "모든 경고를 수정한 후에 커밋한다"는 원칙을 따르며, Shellcheck 및 다른 linters를 pre-commit 설정에 포함함.
  - 대부분의 쉘 스크립트는 .gitlab-ci.yml 파일에 포함되어 있어 검사하기 어려움. 이를 자동으로 검사하는 래퍼를 만듦.

- **Bash 언어 서버**
  - Bash 언어 서버도 존재함.

- **Shellcheck의 학습 효과**
  - Shellcheck를 사용하여 첫 번째 프로덕션 /bin/sh 스크립트를 검사했을 때, 80년대부터 스크립트를 작성해온 경험에도 불구하고 새로운 것을 배움.

- **Bach 사용 권장**
  - Bash를 사용해야 할 때 Bach를 사용하는 것을 권장함. 충분히 긴 작업에 대해 Bash를 사용하는 것은 적절하지 않을 수 있음.

- **Shellcheck와 소스/임포트 처리**
  - Shellcheck는 훌륭하지만, 소스나 임포트를 다루는 것은 매우 번거로움. 이는 sh가 악몽과 같기 때문에 발생하는 문제임.
