
不知道各位有沒有寫過,清空 build 目錄,跑幾個 cli 指令
般檔案,壓縮輸出,在 mac 或是 linux 一行 bash 指令就可以搞定
如果 window 開發者加入團隊後,同一份腳本就直接炸裂
像是環境變數的語法不同,路徑換行符不一樣等...etc
Bun shell 就是為了解決這樣的老問題而誕生的
他是一個 bun 的子模組,讓你可以直接在 javascript/typescript
用類似 bash 語法寫 shell script,而且在 window, linux, mac 的行為完全一致
大部分人在 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);

如果想要 nodejs 相關參考,可以參考 nodejs_child_process
nodejs 針對 執行cli 的設計是基於 一般我們輸指令的狀況 狀態錯誤以及回傳等,但我們為了針對不同平台的使用者
通常需要裝 cross-env 或是 rimraf(如果有刪除的需求的話) 去處理跨平台問題
我們期望,可以直接簡單的,且不需要安裝額外依賴的方式解決這方面的問題。
上手,從第一行指令開始 : Bun shell 的入口是 $
import { $ } from 'bun'
import { $ } from 'bun'
// 直接 stdout
// await $`ls -l *.txt`;
// 直接取得結果
const text = await $`ls -l *.txt`.text();
console.log(text);
我們看看執行長怎樣

就是這麼簡單!!
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);
}
看看結果

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