iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0

day12_title

前言

不知道各位有沒有寫過,清空 build 目錄,跑幾個 cli 指令
般檔案,壓縮輸出,在 mac 或是 linux 一行 bash 指令就可以搞定

如果 window 開發者加入團隊後,同一份腳本就直接炸裂
像是環境變數的語法不同,路徑換行符不一樣等...etc

Bun shell 就是為了解決這樣的老問題而誕生的

Bun shell 是什麼?

他是一個 bun 的子模組,讓你可以直接在 javascript/typescript
用類似 bash 語法寫 shell script,而且在 window, linux, mac 的行為完全一致

為何不用 nodejs 的 child_process ?

大部分人在 nodejs 執行 shell script 會用 child_process

以下範例 :

我們做一個簡單的,列出所有當下目錄的 txt 檔

import { spawnSync } from 'node:child_process';

const { status, stdout, stderr } = spawnSync('ls', ['-l', '*.txt'], {
  encoding: 'utf8',
  shell: true
});


// console.log('status ====='); // 如果想看 status 可以打開註解
// console.log(status);
console.log('stdout =====');
console.log(stdout);
// console.log('stderr ====='); // 通常是不會有錯誤,不過想看錯誤可以打開註解
// console.log(stderr);

child_process_sample

如果想要 nodejs 相關參考,可以參考 nodejs_child_process

分析問題

nodejs 針對 執行cli 的設計是基於 一般我們輸指令的狀況 狀態錯誤以及回傳等,但我們為了針對不同平台的使用者
通常需要裝 cross-env 或是 rimraf(如果有刪除的需求的話) 去處理跨平台問題

(可以參考)
cross-env
rimraf

我們期望,可以直接簡單的,且不需要安裝額外依賴的方式解決這方面的問題。

下去!!,換 bun shell 出場,他怎麼搞定這樣的問題

上手,從第一行指令開始 : Bun shell 的入口是 $

import { $ } from 'bun'

讓我們做一樣的事情 - 列出所有當下目錄的 txt 檔

import { $ } from 'bun'

// 直接 stdout
// await $`ls -l *.txt`;

// 直接取得結果
const text = await $`ls -l *.txt`.text();
console.log(text);

我們看看執行長怎樣

bun_shell_result-1

就是這麼簡單!!

幾個好用的細節

Glob pattern

Bun 的 Glob 是原生支援的, **, *, {},這些 glob pattern 都內建支援的
不用額外裝 Glob 依賴,(我說的是這個 Glob)

簡單示範一下:

我們找到所有工作目錄下的 txt

import { Glob } from 'bun'

const glob = new Glob('**/*.txt');

for await (const file of glob.scan('.')) {
  console.log(file);
}

看看結果

glob_pattern

結論

Bun Shell 想解決的問題很直接:「寫一次 shell script,到哪個平台都能跑」。
做法是把 shell 直譯器整個搬進 JavaScript runtime 裡,而不是依賴系統上裝了什麼 shell。
對於需要寫 build script、CI 腳本、或是團隊裡有 Windows 開發者的專案來說,
這省下的不只是相容性程式碼,更是「這段腳本在同事電腦上會不會壞掉」的心理負擔。
如果你已經在用 Bun,把手邊那些依賴 bash 語法的小腳本改寫成 $ 開頭的 template literal,通常是一個下午就能完成、而且立刻見效的重構。


上一篇
Bun SQLite:內建資料庫支援,不需要額外安裝
下一篇
Bun Test:內建測試框架,Jest 相容的快速測試體驗
系列文
不只是快 —— Bun 30 天:從底層架構、全套工具鏈到生產部署19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言