シェルスクリプトをJavaScript/TypeScriptで記述、どのOSでも実行できる「Bun Shell」、JavaScriptランタイムのBunが発表
JavaScriptランタイムのBunは、新機能としてシェルスクリプトをJavaScriptもしくはTypeScriptで記述し、特定のOSに依存せずに実行できる「Bun Shell」を発表しました。
シェルスクリプトは特定のシェルに依存するもの
LinuxやmacOS、WindowsなどのOSは一般に、「シェル」(Shell)と呼ばれる機能を備えています。
シェルはコマンドラインインターフェイスなどのユーザーとの対話機能を備えており、例えばLinuxのコマンドラインで「ls」コマンドを打ち込むとファイルの一覧が返ってくるという動作はシェルが提供しています。
そしてシェルでは一般に、こうしたコマンドを複数つなげた一連の動作をスクリプトとして定義し実行できる「シェルスクリプト」が利用可能です。例えば、次のシェルスクリプトは、「ls」コマンドによるファイルの一覧をファイル「list.txt」に書き込んでいます。
ls > list.txt
シェルスクリプトはプログラミング言語の一種であり、簡単な処理であればさっとシェルスクリプトで記述して実行してしまう、ということはプログラマのあいだでよく行われていることです。
ただしシェルには複数の種類があります。例えばLinuxでは「sh」や「bash」や「zsh」などが、Windowsでも以前から提供されているコマンドラインツールの「cmd」に加えてより高機能な「PowerShell」などがあり、好みや用途に合わせて使い分けることができます。
しかしそれぞれのシェルスクリプトの記述は微妙に異なることが多く、あるシェル用に書いたシェルスクリプトは別のシェルでは動作が保証されません。
また、LinuxやmacOSとWindowsでは使えるコマンドも異なるため(例えばLinuxの「ls」に相当するコマンドはWindowsでは「dir」など)、シェルスクリプトは基本的に、特定のOSの特定のシェルに依存して記述され、実行されるものでした。
JavaScript/TypeScriptでクロスプラットフォームなシェルスクリプト
今回発表されたBunは、このシェルスクリプトをプログラマが使い慣れたJavaScriptもしくはTypeScriptで記述でき、LinuxやmacOS、WindowsのOSやシェルの種類に依存せず、どこでも同様に実行できるクロスプラットフォーム対応という2つの利点を提供するものです。
下記はBun Shellのシンプルなサンプルコードとして、拡張子が「.js」のファイルの一覧を標準出力に出力するコードです。
import { $ } from "bun";
// to stdout:
await $`ls *.js`;
1行目のimport文は、Bun Shellの実行環境を読み込んでいます。3行目の「await」は、コマンドの処理が終わるまで待つことを指定するコマンド。「$」でBun Shell の実行を指定し、バッククオート(`)で囲まれた文字列が実行される中味となります。
もちろん、パイプやリダイレクトも使えます。下記はパイプの例。
import { $ } from "bun";
await $`ls *.js | grep foo`;
環境変数のセットも可能。環境変数「FOO」を「foo」にセットする例。
import { $ } from "bun";
await $`FOO=foo bun -e 'console.log(process.env.FOO)'`;
// foo\n
JavaScriptの変数をBun Shellスクリプト内で使えるのは面白いところかもしれません。
import { $ } from "bun";
const resp = await fetch("https://example.com");
const stdout = await $`gzip -c < ${resp}`.arrayBuffer();
Bun Shellスクリプトをファイルとして記述し、拡張子「.bun.sh」を付けてBunに渡すと、Bun Shellスクリプトとして実行してくれます。
echo "echo Hello World!" > script.bun.sh
bun ./script.bun.sh
> Hello World!
Bun Shellは現在実験的実装の段階で、主要なシェルコマンドなどを実装していくとしています。
Bunはいかにして競合と差別化するか?
BunはJavaScriptランタイムとして、Node.jsやDenoとの競合と位置づけられています。しかしエコシステムの面で先行するNode.jsや商用サービスのDeno Deployなどを展開中のDenoに対して、Bunが大きく先行する点が明確にあるとはいえない状態です。
そうした中で、今回のBun Shellの提供は、開発者にとって身近で手軽なツールとしてBunを位置づけたいという目論見があるように見えます。
あわせて読みたい
NVMeに新機能。ストレージがデータ処理を行う「コンピュテーショナルストレージ」、NVM Expressが発表
≪前の記事
グローバルなデータセンターの電力消費量が4年で2倍以上に急増、国際エネルギー機関が予測。今後のAI分野の競争は電力調達が勝敗を握るようになるか?