10 ポイント 投稿者 GN⁺ 2024-01-22 | 1件のコメント | WhatsAppで共有
  • JavaScript/TypeScriptからシェルの呼び出しが簡単になる
  • クロスプラットフォームで、Linux/Windows/macOSのすべてで利用可能
    • 共通のコマンドや機能をすべて内部実装: globbing、環境変数、redirection、piping
  • JavaScriptは世界で最も人気のあるスクリプト言語であるにもかかわらず、シェルスクリプトの実行は難しかった。
  • child_processモジュールのspawnSync関数やfs/promisesreaddir関数を使って似た作業はできるが、従来のシェルスクリプトほど簡単ではない。

既存シェルとJavaScriptの互換性の問題

  • bashshのようなシェルは何十年も使われてきたが、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をバッファやファイルにリダイレクトしたり、他のコマンドにパイプしたりできる。
  • cdechormのような組み込みコマンドを使用でき、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件のコメント

 
GN⁺ 2024-01-22
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.

    • シェルスクリプトの強みは、シェルの標準ライブラリに含まれていない複数の独立したユーティリティを簡単に扱えることだが、この新しいシェルではその点があまり強調されていないように見える。
    • また、ある言語を別の言語の中に文字列として埋め込むのは、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)で動作し、基本的に同じことを実現できるものとして、人気のJSライブラリ Execa[1] を勧めている。非常によく動くという。
  • 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のほうが今でもそれをよりうまく実現していると評価している。