10 poin oleh GN⁺ 2024-01-22 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2024-01-22
Komentar Hacker News
  • We've implemented many common commands and features like globbing, environment variables, redirection, piping, and more.

    • Implementasi shell baru ini mencakup perintah dan fitur umum seperti globbing, variabel lingkungan, redirection, piping, dan lain-lain.
    • Namun, masih belum ada keyakinan yang cukup soal kompatibilitasnya dengan implementasi shell dan coreutils yang sudah ada.
    • Tidak jelas apakah targetnya adalah kepatuhan terhadap standar POSIX atau kompatibilitas dengan Bourne shell, serta apakah ekstensi GNU didukung.
    • Masih kurang rincian tentang bagaimana perilakunya ketika sistem memiliki GNU coreutils, dan apakah penambahan perintah bawaan di masa depan bisa menimbulkan perubahan tak terduga.
    • Disebutkan bahwa mengganti shell yang kompatibel dengan Bourne seperti ZShell dengan shell ini tidak diinginkan dalam kebanyakan situasi.
    • Di ekosistem JS, perintah memang sudah perlu ditulis agar kompatibel dengan berbagai shell, jadi menstandarkan subset berguna dari shell yang kompatibel dengan Bourne bisa membuatnya hampir 100% kompatibel dengan yang sudah berjalan di sebagian besar platform, sambil tetap bekerja sesuai maksud di semua platform.
  • Love that bun just implements anything that could be useful.

    • Menilai positif bahwa Bun mengimplementasikan apa pun yang berpotensi berguna.
  • This looks exactly like zx by Google. And that's probably a good thing.

    • Implementasi shell ini terlihat sangat mirip dengan zx dari Google. Itu mungkin hal yang baik.
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • Menunjukkan bahwa di Arch Linux, /bin/sh adalah symbolic link ke bash, sehingga yang diukur sebenarnya hal yang sama.
    • Pada sistem seperti Debian, /bin/sh adalah dash, yang beberapa kali lebih cepat daripada bash dalam startup dan performa umum.
  • I work on Bun - happy to answer any questions/feedback

    • Sebagai pengembang Bun, ia siap menjawab pertanyaan atau menerima masukan.
  • 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.

    • Kekuatan shell scripting adalah kemampuannya untuk dengan mudah mengelola banyak utilitas independen yang tidak harus ada di dalam stdlib shell, tetapi penekanan seperti itu sulit ditemukan pada shell baru ini.
    • Menyematkan satu bahasa sebagai string di dalam bahasa lain sangat jarang menghasilkan UX yang baik.
    • Namun, portabilitas shell ini memang menyelesaikan masalah besar.
  • 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!

    • Merekomendasikan library JS populer Execa[1], yang bekerja di semua runtime JS (Deno, Node) dan pada dasarnya memberikan fungsi yang sama.
  • Another alternative is the ZX shell[2] JS library. Tho haven't tested it.

    • Library JS ZX shell[2] juga bisa menjadi alternatif, meskipun belum diuji.
  • 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!

    • Sangat menyukai Bun dan tidak lagi memakai Node untuk development. Hampir tidak ada lagi hal menjebak, dan performanya lebih cepat di segala sisi. Terutama 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:

    • Baru mengetahui bahwa di JS fungsi bisa dieksekusi tanpa tanda kurung menggunakan backtick (`). Bun juga memakai fungsi tanda dolar ($) untuk menjalankan perintah shell, yang merupakan salah satu keanehan sihir sintaks JS.
  • Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.

    • Shell ini mendekati ergonomi yang sudah ditawarkan Perl selama puluhan tahun. Dan Perl masih melakukannya dengan lebih baik.