셸 스크립팅을 위해 설계된 Haskell의 작은 방언 ‘Hell’을 소개한다. bash의 단점과 장점, 셸 스크립팅 언어가 갖춰야 할 요건, Haskell을 택한 이유와 설계 결정, 배포 및 자료 링크를 다룬다.
Hell은 내가 셸 스크립팅 용도로 직접 만든, 아주 작은 Haskell 방언의 셸 스크립팅 언어다. 2월부터는 Hakyll 대신 Hell을 사용해 이 블로그를 생성하고 있다.1
업데이트: 2024년 10월 3일 기준, Terraform과 여러 API와 함께 업무에서 2천 줄 규모의 다양한 큰 스크립트들에 사용하고 있다.
#!/usr/bin/env hell
main = do
Text.putStrLn "Please enter your name and hit ENTER:"
name <- Text.getLine
Text.putStrLn "Thanks, your name is: "
Text.putStrLn name
2024년 새해 목표는 자동화를 위해 셸 스크립트를 더 많이 쓰는 것이었다. 나는 늘 bash의 단점들 때문에 이것을 피해 왔다. 그리고 다른 문제들도 있다.
bash, zsh, fish 등에는 문제가 있다:
x=$(ls -1) ..)을 사용해 실수하기 쉽다.하지만 bash에도 장점이 있다. 안정적이고 단순하며, 모든 머신에서 동일하게 동작한다. bash 스크립트를 한 번 써 두면 코드를 전혀 바꾸지 않고도 수년 동안 돌릴 수 있다. 작년에 쓴 코드는 내년에도 그대로일 것이다. 이는 대부분의 인기 있는 프로그래밍 언어에 대해 사실이 아니다. Haskell만 봐도 그렇다.
그래서 내가 쓰고 싶은 언어를 정의한다는 관점에서, 셸 스크립팅 언어의 골격을 논해 보자:
왜 모듈이나 패키지 시스템이 없나? 시스템이 “완료” 상태가 되기 어렵게 만들기 때문이다. 항상 할 수 있는 다른 통합이 있고, 추가할 다른 기능이 있다. 나는 Hell이 냉혈 소프트웨어이길 선호한다. 완성된 소프트웨어에는 아름다움이 있다.
위에 근거해 나는 _스크립팅 임계값_을 정의할 수 있다. 즉, 모듈 시스템이나 패키지 시스템, 추상화 능력에 손이 가거나, 표준 라이브러리에 있는 것보다 더 많은 것을 원한다면, 아마 일반 목적 프로그래밍 언어를 써야 할 때일 것이다.
이를 감안하여, 나는 다음 이유들로 Haskell 방언6을 만들기로 했다:
언어를 설계하며 다음과 같은 결정을 내렸다:
fix를 사용할 수 있다.릴리스 페이지에서 정적 링크된 Linux 바이너리를 다운로드할 수 있다. 구현 내부에 대한 설명은 내가 회사에서 Hell을 발표하려고 만든 슬라이드 모음인 Tour of Hell을 참고하라.
ShellCheck의 린트 이슈 목록만 봐도 방대하다.↩︎
코드 실행에 관한 이 블로그 글을 보라.↩︎
참고: Escaping the Hamster Wheel of Backwards Incompatibility↩︎
그리고 다른 대안 셸 스크립팅 언어나 Elixir를 쓰는 것, 혹은 Oil을 쓰지 않은 이유다.↩︎