- Việc gọi Shell từ Javascript/Typescript trở nên dễ dàng hơn
- Hỗ trợ đa nền tảng, dùng được trên Linux/Windows/macOS
- Tự triển khai nội bộ các lệnh và tính năng phổ biến: globbing, biến môi trường, redirection, piping
- Mặc dù JavaScript là ngôn ngữ scripting phổ biến nhất thế giới, việc chạy shell script lại không hề dễ dàng.
- Có thể dùng hàm
spawnSync của mô-đun child_process hoặc hàm readdir của fs/promises để làm các tác vụ tương tự, nhưng không đơn giản như shell script truyền thống.
Vấn đề tương thích giữa shell truyền thống và JavaScript
- Các shell như
bash hay sh đã được sử dụng suốt hàng chục năm, nhưng lại không hoạt động tốt trong JavaScript.
zsh trên macOS, bash trên Linux và cmd trên Windows có cú pháp và câu lệnh khác nhau, gây ra vấn đề tương thích.
- npm từ trước đến nay đã dựa vào cách cộng đồng bù đắp các lệnh còn thiếu bằng các bản triển khai JavaScript.
Các lệnh không chạy trên Windows
- Lệnh
rm -rf không chạy trên Windows, nên bản triển khai JavaScript đa nền tảng là rimraf được tải xuống 60 triệu lần mỗi tuần.
- Cách thiết lập biến môi trường khác nhau giữa các nền tảng, và trên Windows cần dùng
cross-env.
- Lệnh
which trên Windows được dùng dưới tên where, nên gói dành cho việc này cũng được tải xuống 60 triệu lần mỗi tuần.
Vấn đề thời gian khởi động shell
- Thời gian để khởi động shell là khoảng 7ms trên máy Linux x64 Hetzner chạy Arch Linux.
- Khi chỉ chạy một lệnh đơn lẻ, thời gian khởi động shell có thể lâu hơn cả thời gian thực thi lệnh.
- Nếu chạy nhiều lệnh trong một vòng lặp, chi phí này có thể trở nên đáng kể.
Sự cần thiết của polyfill
- Từ năm 2009 đến 2016, khi JavaScript còn tương đối mới và mang tính thử nghiệm, việc cộng đồng polyfill các tính năng còn thiếu là điều hợp lý.
- Nhưng ở thời điểm 2024, JavaScript phía máy chủ đã trưởng thành và được chấp nhận rộng rãi, đồng thời hệ sinh thái JavaScript hiện đã hiểu các nhu cầu hiện tại tốt hơn trước.
Giới thiệu Bun Shell
- Bun Shell là một ngôn ngữ và trình thông dịch thử nghiệm mới được tích hợp sẵn trong Bun, cho phép chạy shell script đa nền tảng từ JavaScript và TypeScript.
- Với Bun Shell, có thể dùng biến JavaScript trong shell script, và mọi biến trong template đều được escape để tăng cường bảo mật.
- Bun Shell mang lại cảm giác giống JavaScript thông thường, đồng thời có thể redirect stdout sang buffer hoặc file, hoặc pipe sang lệnh khác.
- Có thể dùng các lệnh tích hợp như
cd, echo, rm, và chúng hoạt động trên Windows, macOS, Linux.
- Bun Shell được thiết kế để thay thế các shell script đơn giản, và khi dùng Bun trên Windows, nó sẽ chạy
bun run trong phần "scripts" của package.json.
- Cũng có thể dùng như một trình thông dịch shell script độc lập.
Cách cài đặt
- Bun Shell được tích hợp sẵn trong Bun, và nếu đã cài Bun v1.0.24 trở lên thì có thể dùng ngay.
- Nếu chưa cài Bun, có thể cài bằng curl hoặc npm.
Ý kiến của GN⁺
- Bun Shell đưa ra một cách tiếp cận đổi mới nhằm giải quyết vấn đề tương thích giữa shell script truyền thống và JavaScript.
- Hỗ trợ đa nền tảng và cách sử dụng đơn giản giúp các nhà phát triển có được trải nghiệm scripting nhất quán trong nhiều môi trường khác nhau.
- Những công cụ như vậy phản ánh sự trưởng thành của hệ sinh thái JavaScript và được kỳ vọng sẽ góp phần nâng cao năng suất của nhà phát triển trong môi trường công nghệ thay đổi nhanh chóng.
1 bình luận
Ý kiến Hacker News
Thật thích việc Bun cứ triển khai mọi thứ có thể hữu ích.
Cái này trông y hệt zx của Google. Và đó có lẽ là điều tốt.
/bin/shlà một symbolic link tới bash, nên thực tế đang đo cùng một thứ./bin/shlà dash, nhanh hơn bash nhiều lần cả khi khởi động lẫn trong hiệu năng thông thường.Tôi làm việc trên Bun - rất sẵn lòng trả lời mọi câu hỏi/phản hồi
Cái này khá hay, nhưng a) điều mạnh mẽ ở shell scripting, theo tôi, là nó cho phép bạn dễ dàng điều phối nhiều tiện ích độc lập không cần bị gói trong stdlib của shell (có thể tôi đã bỏ sót gì đó, nhưng tôi không thấy điểm này được nhấn mạnh), và b) việc nhúng một ngôn ngữ dưới dạng chuỗi bên trong một ngôn ngữ khác hiếm khi là UX tốt.
Với thứ gì đó hoạt động trên mọi JS runtime (Deno, Node) và về cơ bản đạt được điều tương tự, hãy thử thư viện JS phổ biến Execa[1]. Hoạt động rất mượt!
Một lựa chọn thay thế khác là thư viện JS ZX shell[2]. Dù tôi chưa thử.
Tôi rất thích Bun. Tôi không còn dùng Node để phát triển nữa. Giờ hầu như chẳng còn bẫy nào đáng kể. Nó đơn giản là nhanh hơn trên mọi mặt. Đặc biệt là
bun test. Rất đáng khuyến nghị. Cảm ơn @Jarred!bun testrất nhanh. Rất đáng được khuyến nghị.Tôi không biết điều này, nhưng có vẻ trong JS bạn có thể thực thi một hàm mà không cần dấu ngoặc bằng cách dùng dấu backtick (`), ví dụ:
Tuyệt, nó đang tiến gần tới mức độ tiện dụng mà Perl đã cung cấp suốt hàng chục năm. Và Perl vẫn làm tốt hơn.