- JavaScript/TypeScriptからシェルの呼び出しが簡単になる
- クロスプラットフォームで、Linux/Windows/macOSのすべてで利用可能
- 共通のコマンドや機能をすべて内部実装: globbing、環境変数、redirection、piping
- JavaScriptは世界で最も人気のあるスクリプト言語であるにもかかわらず、シェルスクリプトの実行は難しかった。
child_processモジュールのspawnSync関数やfs/promisesのreaddir関数を使って似た作業はできるが、従来のシェルスクリプトほど簡単ではない。
既存シェルとJavaScriptの互換性の問題
bashやshのようなシェルは何十年も使われてきたが、JavaScriptではうまく動作しない。
- macOSの
zsh、Linuxのbash、Windowsのcmdはそれぞれ異なる構文とコマンドを持っており、互換性の問題が発生する。
- npmは、コミュニティが不足しているコマンドをJavaScript実装で補う形を取ってきた。
Windowsで動作しないコマンド
rm -rfコマンドはWindowsでは動作しないため、クロスプラットフォームなJavaScript実装であるrimrafが週6,000万回ダウンロードされている。
- 環境変数の設定はプラットフォームごとに異なり、Windowsでは
cross-envを使う必要がある。
whichコマンドはWindowsではwhereとして使われるため、そのためのパッケージも週6,000万回ダウンロードされている。
シェルの起動時間の問題
- シェルの起動にかかる時間は、Linux 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エコシステムの成熟を反映しており、急速に変化する技術環境の中で開発者の生産性向上に貢献すると期待される。
1件のコメント
Hacker Newsのコメント
Love that bun just implements anything that could be useful.
This looks exactly like zx by Google. And that's probably a good thing.
/bin/shがbashへのシンボリックリンクなので、実際には同じものを測定していると指摘している。/bin/shはdashであり、bashより起動や一般的な性能が数倍速い。I work on Bun - happy to answer any questions/feedback
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!
Another alternative is the ZX shell[2] JS library. Tho haven't tested it.
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 testが非常に優れているとし、強く推薦している。I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:
Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.