【Bun】JavaScriptでシェルスクリプトを書けると噂のBun Shell使ってみた

今回はBunのバージョン1.0.24で追加されたBun Shellを試してみたいと思います。

Bunについては過去の私のブログ記事でも紹介しているのでそちらも一緒にご覧ください。

こちらでも簡単に紹介しますと、Bunとは最新の JavaScript エコシステムに対応するためにゼロから構築された新しい JavaScript ランタイムです。

JavaScriptランタイムということなのでNodeやDenoと同じ枠組みということになります。

そんなBunですが、2024年1月20日にアップデートされJavaScriptでシェルスクリプトを書けるようになりました。

JavaScriptは世界で最も人気のあるスクリプト言語です。

そんなJavaScriptで書けるようになるということは開発者は普段使っている既存のJavaScriptの知識を活用し効率的にシェルスクリプトを書くことができます。

目次

環境情報

OS: MacOS

JavaScript Runtimes: Bun

シェル: Bash

{
  "name": "bun-test",
  "module": "index.ts", 
  "type": "module",
  "devDependencies": {
    "@types/bun": "latest"
  },
  "peerDependencies": {
    "typescript": "^5.0.0"
  }
}

Bunインストール

Bunをインストールしてない人も多いので環境構築から始めます。

公式サイトはこちら。

$ curl -fsSL https://bun.sh/install | bash 

もしくは

$ npm install -g bun

でインストールできます。
BunはNode.jsに変わる新たなJavaScriptランタイムのデファクトスタンダードになることをゴールに掲げているので公式のnpm install手順にて the last `npm` command you’ll ever need これがあなたの最後のnpmコマンドですとコメントしています。

ちなみに私はasdfでバージョン管理しているので以下のように設定しました。

% asdf plugin add bun
updating plugin repository...remote: Enumerating objects: 41, done.
remote: Counting objects: 100% (41/41), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 41 (delta 22), reused 40 (delta 22), pack-reused 0
Unpacking objects: 100% (41/41), 38.83 KiB | 846.00 KiB/s, done.
From https://github.com/asdf-vm/asdf-plugins
f32b6d1..8aa2e59 master -> origin/master
HEAD is now at 8aa2e59 feat: add shorebird plugin (#949)
% asdf install bun 1.0.26
Downloading Bun v1.0.26...
Archive: /var/folders/lf/k55rsnz923xb89gkhd2cx36h0000gn/T/asdf-bun.VlM7/bun.zip
inflating: /Users/x9wkpmjph7_matsura/.asdf/downloads/bun/1.0.26/bun 
Installing Bun v1.0.26...
Bun v1.0.26 is installed successfully!
% asdf global bun 1.0.26
% bun -v
1.0.26

同じくasdfを使っている方は参考にしてみてください。

実際にBunでシェルスクリプトを書いてみる

では実際にBunでシェルスクリプトを書いてみたいと思います。

$ bun init
bun init helps you get started with a minimal project and tries to guess sensible defaults. Press ^C anytime to quit

package name : bun-test
entry point (index.ts):

Done! A package.json file was saved in the current directory.
+ index.ts
+ .gitignore
+ tsconfig.json (for editor auto-complete)
+ README.md

To get started, run:
bun run index.ts

bun initコマンドを実行すると、bun プロジェクトの最小のテンプレートが自動生成されます。

ディレクトリとしてはこんな感じです。

package-lockやyarn.lockに当たるのがbun.lockbですねアイコンがトレードマークの肉まんで可愛いです。

今回はBun Shellを試してみたいので、index.tsの中身を全て消し以下のように書いてみました。

import { $ } from "bun";

await $`echo "Hello, World!"`;

こちらの公式ページを読んで単純に”Hello, World!”を表示するシェルスクリプトを書いてみました。

実行してみます。

$ bun index.ts
Hello, World!

うまくいきました。

これだけでは味気ないのでaws cliを使用したシェルスクリプトを書いてみたいと思います。

import { $ } from "bun";

await $`aws s3 ls --profile sandbox-matsura`;

aws s3 l3コマンドを実行したいと思います

$ bun index.ts
2024-01-28 00:30:54 amplify-nextamplified-dev-03037-deployment
2023-12-20 13:20:38 cdk-hnb659fds-assets-************-ap-northeast-1

AWSアカウントIDが写ってしまったので念の為伏せ字にしましたが、見事コマンド通りS3のバケットリストを表示することができました。

環境変数も使える

ルート直下に.env.localファイルを作成し環境変数を以下のように作ってみました。

PROFILE_NAME="sandbox-matsura"

先程のシェルスクリプトを以下のように変えて実行してみます。

import { $ } from "bun";

await $`aws s3 ls --profile ${process.env.PROFILE_NAME}`;

実行結果

$ bun index.ts
2024-01-28 00:30:54 amplify-nextamplified-dev-03037-deployment
2023-12-20 13:20:38 cdk-hnb659fds-assets-************-ap-northeast-1

うまくいきました。

実行結果を代入できる

text()メソッドを使うと実行結果を出力せずに文字列として代入できます。

import { $ } from "bun";

const s3List = await $`aws s3 ls --profile ${process.env.PROFILE_NAME}`.text();
console.log(s3List);

こちらを実行すると同じように

$ bun index.ts
2024-01-28 00:30:54 amplify-nextamplified-dev-03037-deployment
2023-12-20 13:20:38 cdk-hnb659fds-assets-************-ap-northeast-1

となります。

終わりに

Bun Shellを使ってJavaScriptの記述でシェルスクリプトを書いてみました。

簡単なコードしか試してないですが、JavaScriptは読み書きできる人が多いのでShellでも記述できるようになるというのはかなり恩恵があると思いました。

 

他にも技術ブログをあげているのでそちらもよろしければ見ていってださい。

私のブログ記事一覧

 

株式会社ギークフィードでは開発エンジニアなどの職種で一緒に働く仲間を募集しています。

弊社に興味を持っていただいたり、会社のことをカジュアルに聞いてみたいという場合でも、ご気軽にフォームからお問い合わせください。その場合はコメント欄に、カジュアルにお話したいです、と記載ください!

採用情報はコチラ

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ