5P by neo 2023-11-25 | favorite | 댓글 1개

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 언어로 개발되었다는 점이 소프트웨어 개발자들에게 매력적으로 다가갈 수 있음.
Hacker News 의견
  • 스크립트 작성 시 주의사항

    • -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가 악몽과 같기 때문에 발생하는 문제임.