- Memanggil Shell dari Javascript/Typescript menjadi lebih mudah
- Lintas platform sehingga bisa digunakan di Linux/Windows/macOS
- Perintah dan fitur umum diimplementasikan secara internal: globbing, variabel lingkungan, redirection, piping
- Meskipun JavaScript adalah bahasa scripting paling populer di dunia, menjalankan shell script tetap sulit.
- Kita bisa memakai fungsi
spawnSync dari modul child_process atau fungsi readdir dari fs/promises untuk melakukan pekerjaan serupa, tetapi tetap tidak sesederhana shell script yang ada.
Masalah kompatibilitas antara shell lama dan JavaScript
- Shell seperti
bash atau sh telah digunakan selama puluhan tahun, tetapi tidak bekerja dengan baik di JavaScript.
zsh di macOS, bash di Linux, dan cmd di Windows memiliki sintaks dan perintah yang berbeda, sehingga menimbulkan masalah kompatibilitas.
- npm selama ini mengandalkan komunitas untuk menutup kekurangan perintah yang hilang lewat implementasi JavaScript.
Perintah yang tidak berjalan di Windows
- Perintah
rm -rf tidak berjalan di Windows, sehingga implementasi JavaScript lintas platform bernama rimraf diunduh 60 juta kali per minggu.
- Pengaturan variabel lingkungan berbeda di tiap platform, dan di Windows harus memakai
cross-env.
- Perintah
which di Windows digunakan sebagai where, dan paket untuk ini juga diunduh 60 juta kali per minggu.
Masalah waktu startup shell
- Waktu yang dibutuhkan untuk memulai shell sekitar 7ms pada mesin Linux x64 Hetzner Arch Linux.
- Saat hanya menjalankan satu perintah, waktu untuk memulai shell bisa lebih lama daripada waktu menjalankan perintah itu sendiri.
- Jika banyak perintah dijalankan dalam loop, biayanya bisa menjadi besar.
Kebutuhan akan polyfill
- Dari 2009 hingga 2016, ketika JavaScript masih relatif baru dan eksperimental, masuk akal bila komunitas membuat polyfill untuk fitur yang belum ada.
- Namun pada 2024, JavaScript di server sudah matang dan diadopsi luas, dan ekosistem JavaScript kini memahami kebutuhan saat ini lebih baik daripada sebelumnya.
Pengenalan Bun Shell
- Bun Shell adalah bahasa dan interpreter eksperimental baru yang terintegrasi di Bun, yang memungkinkan menjalankan shell script lintas platform dari JavaScript dan TypeScript.
- Dengan Bun Shell, variabel JavaScript bisa digunakan di dalam shell script, dan semua variabel template di-escape untuk meningkatkan keamanan.
- Bun Shell terasa seperti JavaScript biasa, dan
stdout bisa diarahkan ke buffer atau file, atau di-pipe ke perintah lain.
- Perintah bawaan seperti
cd, echo, dan rm bisa digunakan, dan semuanya berjalan di Windows, macOS, dan Linux.
- Bun Shell dirancang untuk menggantikan shell script sederhana, dan menjalankan
bun run dari package.json "scripts" saat memakai Bun di Windows.
- Bun Shell juga dapat digunakan sebagai interpreter shell script mandiri.
Cara instalasi
- Bun Shell sudah terintegrasi di Bun, dan bisa langsung digunakan jika Bun v1.0.24 atau lebih baru sudah terpasang.
- Jika Bun belum terpasang, Anda dapat menginstalnya menggunakan curl atau npm.
Opini GN⁺
- Bun Shell menawarkan pendekatan inovatif untuk mengatasi masalah kompatibilitas antara shell script lama dan JavaScript.
- Dukungan lintas platform dan kemudahan penggunaan memungkinkan developer mendapatkan pengalaman scripting yang konsisten di berbagai lingkungan.
- Alat seperti ini mencerminkan kematangan ekosistem JavaScript dan diharapkan membantu meningkatkan produktivitas developer di tengah lingkungan teknologi yang berubah cepat.
1 komentar
Komentar Hacker News
Love that bun just implements anything that could be useful.
This looks exactly like zx by Google. And that's probably a good thing.
/bin/shadalah symbolic link ke bash, sehingga yang diukur sebenarnya hal yang sama./bin/shadalah dash, yang beberapa kali lebih cepat daripada bash dalam startup dan performa umum.I work on Bun - happy to answer any questions/feedback
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.
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!
Another alternative is the ZX shell[2] JS library. Tho haven't tested it.
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 test. Sangat direkomendasikan. Terima kasih @Jarred!I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:
Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.