10 điểm bởi GN⁺ 2024-01-22 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

 
GN⁺ 2024-01-22
Ý kiến Hacker News
  • Chúng tôi đã triển khai nhiều lệnh và tính năng phổ biến như globbing, biến môi trường, chuyển hướng, piping, v.v.

    • Bản triển khai shell mới này bao gồm các lệnh và tính năng thông dụng như globbing, biến môi trường, redirection, piping, v.v.
    • Tuy nhiên, vẫn chưa tạo được nhiều niềm tin về mức độ tương thích với các shell hiện có và các triển khai coreutils.
    • Chưa rõ liệu mục tiêu có phải là tương thích với chuẩn POSIX hay shell Bourne, cũng như có hỗ trợ các tính năng mở rộng của GNU hay không.
    • Còn thiếu chi tiết về trường hợp hệ thống đã có GNU coreutils và liệu việc bổ sung thêm lệnh tích hợp trong tương lai có thể gây ra những thay đổi ngoài dự kiến hay không.
    • Có ý kiến chỉ ra rằng việc thay thế shell tương thích Bourne như ZShell bằng shell này là điều không mong muốn trong đa số tình huống.
    • Trong hệ sinh thái JS, vốn đã phải viết lệnh tương thích với nhiều shell khác nhau, việc chuẩn hóa một tập con hữu ích của shell tương thích Bourne có thể giúp nó gần như tương thích 100% với những gì đã chạy được trên hầu hết nền tảng, đồng thời vẫn hoạt động đúng như mong muốn trên mọi nền tảng.
  • Thật thích việc Bun cứ triển khai mọi thứ có thể hữu ích.

    • Đánh giá tích cực việc Bun triển khai mọi thứ có thể hữu dụng.
  • Cái này trông y hệt zx của Google. Và đó có lẽ là điều tốt.

    • Bản triển khai shell này có vẻ rất giống zx của Google. Điều đó có thể là một tín hiệu tốt.
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • Có ý kiến chỉ ra rằng trên Arch Linux, /bin/sh là một symbolic link tới bash, nên thực tế đang đo cùng một thứ.
    • Trên các hệ như Debian, /bin/sh là 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

    • Với tư cách là nhà phát triển Bun, họ sẵn sàng trả lời câu hỏi hoặc tiếp nhận 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.

    • Điểm mạnh của shell scripting là có thể dễ dàng xử lý nhiều tiện ích độc lập, nhưng ở shell mới này khó thấy được sự nhấn mạnh vào điều đó.
    • Việc nhúng một ngôn ngữ dưới dạng chuỗi bên trong ngôn ngữ khác không phải là trải nghiệm người dùng tốt.
    • Tuy vậy, tính di động của shell này thực sự giải quyết một vấn đề lớn.
  • 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!

    • Đề xuất thư viện JS Execa[1], vốn chạy trên mọi JS runtime (Deno, Node) và về cơ bản cung cấp chức năng tương 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ử.

    • Thư viện JS ZX shell[2] cũng có thể là một phương án thay thế, dù chưa được tự mình kiểm 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!

    • Rất yêu thích Bun và không còn dùng Node cho phát triển nữa.
    • Hiện gần như không còn vấn đề khó chịu nào, và nó nhanh hơn toàn diện.
    • Đặc biệt bun test rấ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ụ:

    • Họ mới biết rằng trong JS có thể gọi hàm mà không cần ngoặc bằng dấu backtick (`). Bun cũng dùng hàm ký hiệu đô la ($) để chạy lệnh shell, đây là một trong những kiểu “phép thuật cú pháp” kỳ lạ của JS.
  • 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.

    • Đánh giá rằng shell này đang tiến gần đến tính tiện dụng mà Perl đã mang lại từ nhiều thập kỷ trước, nhưng Perl vẫn làm tốt hơn.