10P by neo 3달전 | favorite | 댓글 1개
  • Javascript/Typescript에서 Shell 호출이 쉬워짐
  • 크로스 플랫폼으로 리눅스/윈도우/맥 모두 사용 가능
    • 공통적인 명령 및 기능들을 모두 내부적으로 구현 : globbing, 환경변수, redirection, piping
  • JavaScript는 세계에서 가장 인기 있는 스크립팅 언어임에도 불구하고, 쉘 스크립트를 실행하기가 어려움.
  • child_process 모듈의 spawnSync 함수를 사용하거나 fs/promisesreaddir 함수를 사용해 비슷한 작업을 할 수 있으나, 기존 쉘 스크립트만큼 간단하지 않음.

기존 쉘과 JavaScript의 호환성 문제

  • bashsh 같은 쉘은 수십 년 동안 사용되어 왔으나 JavaScript에서는 잘 작동하지 않음.
  • macOS의 zsh, Linux의 bash, Windows의 cmd는 서로 다른 문법과 명령어를 가지고 있어 호환성 문제 발생.
  • npm은 커뮤니티가 JavaScript 구현으로 빠진 명령어를 채우는 방식을 사용해왔음.

Windows에서 작동하지 않는 명령어들

  • rm -rf 명령어는 Windows에서 작동하지 않아 rimraf라는 크로스 플랫폼 JavaScript 구현이 주당 6000만 번 다운로드됨.
  • 환경 변수 설정은 플랫폼마다 다르며, Windows에서는 cross-env를 사용해야 함.
  • which 명령어는 Windows에서 where로 사용되어, 이를 위한 패키지도 주당 6000만 번 다운로드됨.

쉘의 시작 시간 문제

  • 쉘을 시작하는 데 걸리는 시간은 리눅스 x64 Hetzner Arch Linux 기계에서 약 7ms 소요됨.
  • 단일 명령어를 실행하는 경우 쉘을 시작하는 시간이 명령어를 실행하는 시간보다 길 수 있음.
  • 많은 명령어를 루프에서 실행할 경우 비용이 많이 들 수 있음.

폴리필의 필요성

  • 2009년부터 2016년까지 JavaScript가 상대적으로 새롭고 실험적이었을 때, 커뮤니티가 빠진 기능을 폴리필하는 것은 의미가 있었음.
  • 하지만 2024년 현재, 서버에서의 JavaScript는 성숙하고 널리 채택되었으며, JavaScript 생태계는 현재 요구사항을 이전보다 잘 이해함.

Bun Shell 소개

  • Bun Shell은 Bun에 내장된 새로운 실험적 언어 및 인터프리터로, JavaScript 및 TypeScript에서 크로스 플랫폼 쉘 스크립트를 실행할 수 있게 해줌.
  • Bun Shell을 사용하면 JavaScript 변수를 쉘 스크립트에 사용할 수 있고, 모든 템플릿 변수는 이스케이프 처리되어 보안을 강화함.
  • Bun Shell은 일반 JavaScript처럼 느껴지며, stdout을 버퍼나 파일로 리다이렉트하거나 다른 명령어로 파이프할 수 있음.
  • cd, echo, rm과 같은 내장 명령어를 사용할 수 있으며, Windows, macOS, Linux에서 작동함.
  • Bun Shell은 간단한 쉘 스크립트를 대체하기 위해 설계되었으며, Windows에서 Bun을 사용할 때 package.json "scripts"에서 bun run을 구동함.
  • 독립적인 쉘 스크립트 인터프리터로도 사용할 수 있음.

설치 방법

  • Bun Shell은 Bun에 내장되어 있으며, Bun v1.0.24 이상이 설치되어 있다면 바로 사용할 수 있음.
  • Bun이 설치되어 있지 않다면, curl이나 npm을 사용하여 설치할 수 있음.

GN⁺의 의견

  • Bun Shell은 기존 쉘 스크립트와 JavaScript의 호환성 문제를 해결하고자 하는 혁신적인 접근 방식을 제시함.
  • 크로스 플랫폼 지원과 간편한 사용법은 개발자들이 다양한 환경에서 일관된 스크립팅 경험을 할 수 있게 해줌.
  • 이러한 도구는 JavaScript 생태계의 성숙함을 반영하며, 빠르게 변화하는 기술 환경에서 개발자들의 생산성을 높이는 데 기여할 것으로 기대됨.
Hacker News 의견
  • We've implemented many common commands and features like globbing, environment variables, redirection, piping, and more.

    • 새로운 쉘 구현이 일반적인 명령어와 기능들(글로빙, 환경 변수, 리다이렉션, 파이핑 등)을 포함하고 있음.
    • 하지만, 기존 쉘과 coreutils 구현과의 호환성에 대한 확신이 부족함.
    • POSIX 표준이나 Bourne 쉘과의 호환성을 목표로 하는지, GNU 확장 기능의 지원 여부가 불분명함.
    • 시스템에 GNU coreutils가 있을 때의 상황과 향후 내장 명령어 추가 시 예상치 못한 변경이 발생할 수 있는지에 대한 세부 사항이 부족함.
    • ZShell과 같은 Bourne 호환 쉘을 이 쉘로 교체하는 것은 대부분의 상황에서 바람직하지 않음을 지적함.
    • JS 생태계에서는 이미 다양한 쉘과 호환되는 명령어를 작성해야 하므로, Bourne 호환 쉘의 유용한 부분 집합을 표준화하는 것이 대부분의 플랫폼에서 이미 작동하는 것과 거의 100% 호환되면서도 모든 플랫폼에서 의도한 대로 작동하게 만들 수 있음.
  • Love that bun just implements anything that could be useful.

    • Bun이 유용할 수 있는 모든 것을 구현한다는 점을 긍정적으로 평가함.
  • This looks exactly like zx by Google. And that's probably a good thing.

    • 이 쉘 구현이 Google의 zx와 매우 유사해 보임. 이는 좋은 일일 수 있음.
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • Arch Linux에서 /bin/sh가 bash로의 심볼릭 링크이기 때문에 실제로 동일한 것을 측정하고 있음을 지적함.
    • Debian과 같은 시스템에서는 /bin/sh가 dash로, bash보다 시작과 일반적인 성능에서 몇 배 더 빠름.
  • I work on Bun - happy to answer any questions/feedback

    • Bun 개발자로서, 질문이나 피드백에 답변할 준비가 되어 있음.
  • This is neat, but a) it strikes me that what's powerful about shell scripting is that it lets you easily wrangle multiple independent utilities that don't need to be contained within the shell stdlib (maybe I'm missing something but I didn't see any emphasis on that), and b) that embedding a language as a string inside another language is very rarely a good UX.

    • 쉘 스크립팅의 강력한 점은 독립적인 유틸리티들을 쉽게 다룰 수 있다는 것인데, 이 새로운 쉘에서는 그러한 강조점을 찾기 어려움.
    • 한 언어를 다른 언어 내부의 문자열로 내장하는 것은 좋은 사용자 경험이 아님을 지적함.
    • 그러나 이 쉘의 이식성은 실제로 큰 문제를 해결함.
  • For something which works across all JS runtimes (Deno, Node) and achieves basically the same, check out the popular JS library Execa[1]. Works like a charm!

    • 모든 JS 런타임(Deno, Node)에서 작동하고 기본적으로 동일한 기능을 제공하는 Execa[1] JS 라이브러리를 추천함.
  • Another alternative is the ZX shell[2] JS library. Tho haven't tested it.

    • ZX shell[2] JS 라이브러리도 대안이 될 수 있음. 하지만 테스트는 해보지 않음.
  • I love Bun. I no longer use Node for development. Hardly any gotchas anymore. It's just faster all over. Especially bun test. Highly recommended. Thank you @Jarred!

    • Bun을 매우 좋아하며, 더 이상 개발에 Node를 사용하지 않음. 거의 문제가 없고, 전반적으로 더 빠름. 특히 bun test가 매우 빠름. 강력히 추천함.
  • I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:

    • JS에서 함수를 괄호 없이 역따옴표(`)를 사용하여 실행할 수 있음을 알게 됨. Bun도 쉘 명령어를 실행하기 위해 달러 기호($) 함수를 사용하는데, 이는 JS의 이상한 문법 마법 중 하나임.
  • Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.

    • 이 쉘은 수십 년 동안 Perl이 제공해온 인간공학에 접근하고 있음. 그리고 Perl이 여전히 더 잘함을 평가함.