10 คะแนน โดย GN⁺ 2024-01-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เรียกใช้ Shell จาก Javascript/Typescript ได้ง่ายขึ้น
  • รองรับข้ามแพลตฟอร์ม ใช้งานได้ทั้ง Linux/Windows/macOS
    • มีการติดตั้งคำสั่งและความสามารถพื้นฐานไว้ภายในทั้งหมด เช่น globbing, ตัวแปรสภาพแวดล้อม, redirection, piping
  • แม้ว่า JavaScript จะเป็นภาษาสคริปต์ที่ได้รับความนิยมมากที่สุดในโลก แต่การรันเชลล์สคริปต์กลับทำได้ยาก
  • สามารถใช้ฟังก์ชัน spawnSync ของโมดูล child_process หรือใช้ฟังก์ชัน readdir จาก fs/promises เพื่อทำงานลักษณะใกล้เคียงกันได้ แต่ก็ยังไม่ง่ายเท่าเชลล์สคริปต์แบบเดิม

ปัญหาความเข้ากันได้ระหว่างเชลล์เดิมกับ JavaScript

  • เชลล์อย่าง bash หรือ sh ถูกใช้งานมานานหลายสิบปี แต่ทำงานร่วมกับ JavaScript ได้ไม่ดีนัก
  • zsh บน macOS, bash บน Linux และ cmd บน Windows มีไวยากรณ์และคำสั่งแตกต่างกัน ทำให้เกิดปัญหาด้านความเข้ากันได้
  • npm ใช้วิธีให้ชุมชนช่วยเติมคำสั่งที่ขาดหายไปผ่านการทำเป็นเวอร์ชัน JavaScript

คำสั่งที่ใช้ไม่ได้บน Windows

  • คำสั่ง rm -rf ใช้งานบน Windows ไม่ได้ ทำให้มีการดาวน์โหลดเวอร์ชัน JavaScript แบบข้ามแพลตฟอร์มชื่อ rimraf ถึง 60 ล้านครั้งต่อสัปดาห์
  • การตั้งค่าตัวแปรสภาพแวดล้อมแตกต่างกันไปในแต่ละแพลตฟอร์ม และบน Windows ต้องใช้ cross-env
  • คำสั่ง which บน Windows ต้องใช้เป็น where จึงมีแพ็กเกจสำหรับแก้ปัญหานี้ที่ถูกดาวน์โหลด 60 ล้านครั้งต่อสัปดาห์เช่นกัน

ปัญหาเวลาเริ่มต้นของเชลล์

  • เวลาที่ใช้ในการเริ่มเชลล์อยู่ที่ราว 7ms บนเครื่อง Linux x64 Hetzner Arch Linux
  • หากรันเพียงคำสั่งเดียว เวลาในการเริ่มเชลล์อาจนานกว่าตัวเวลาที่ใช้รันคำสั่งจริง
  • หากรันคำสั่งจำนวนมากในลูป ต้นทุนส่วนนี้อาจสูงมาก

ความจำเป็นของ polyfill

  • ระหว่างปี 2009 ถึง 2016 ตอนที่ JavaScript ยังถือว่าค่อนข้างใหม่และอยู่ในช่วงทดลอง การที่ชุมชนช่วยทำ polyfill ให้ฟีเจอร์ที่ขาดหายไปถือว่าสมเหตุสมผล
  • แต่ในปี 2024 JavaScript ฝั่งเซิร์ฟเวอร์ได้เติบโตเต็มที่และถูกใช้อย่างแพร่หลายแล้ว และ ecosystem ของ JavaScript ก็เข้าใจความต้องการในปัจจุบันได้ดีกว่าเดิม

แนะนำ Bun Shell

  • Bun Shell คือภาษาและอินเทอร์พรีเตอร์แบบทดลองตัวใหม่ที่ฝังมาใน Bun ซึ่งช่วยให้สามารถรันเชลล์สคริปต์แบบข้ามแพลตฟอร์มจาก JavaScript และ TypeScript ได้
  • เมื่อใช้ Bun Shell สามารถนำตัวแปร JavaScript มาใช้ในเชลล์สคริปต์ได้ และตัวแปรทั้งหมดใน template จะถูก escape เพื่อเพิ่มความปลอดภัย
  • Bun Shell ให้ความรู้สึกเหมือน JavaScript ปกติ และสามารถ redirect stdout ไปยัง buffer หรือไฟล์ หรือ pipe ต่อไปยังคำสั่งอื่นได้
  • สามารถใช้คำสั่ง built-in อย่าง cd, echo, rm ได้ และทำงานบน Windows, macOS, Linux
  • Bun Shell ถูกออกแบบมาเพื่อใช้แทนเชลล์สคริปต์แบบง่าย ๆ และเมื่อใช้ Bun บน Windows ก็สามารถรัน bun run จาก "scripts" ใน package.json ได้
  • ยังสามารถใช้งานเป็นอินเทอร์พรีเตอร์สำหรับเชลล์สคริปต์แบบแยกเดี่ยวได้อีกด้วย

วิธีติดตั้ง

  • Bun Shell มีมาใน Bun อยู่แล้ว และหากติดตั้ง Bun v1.0.24 ขึ้นไปก็สามารถใช้งานได้ทันที
  • หากยังไม่ได้ติดตั้ง Bun สามารถติดตั้งผ่าน curl หรือ npm ได้

ความเห็นของ GN⁺

  • Bun Shell นำเสนอแนวทางใหม่ที่น่าสนใจในการแก้ปัญหาความเข้ากันได้ระหว่างเชลล์สคริปต์แบบเดิมกับ JavaScript
  • การรองรับข้ามแพลตฟอร์มและวิธีใช้งานที่เรียบง่ายช่วยให้นักพัฒนามีประสบการณ์การเขียนสคริปต์ที่สม่ำเสมอในสภาพแวดล้อมที่หลากหลาย
  • เครื่องมือแบบนี้สะท้อนถึงความเติบโตของ ecosystem JavaScript และคาดว่าจะช่วยเพิ่มผลิตภาพของนักพัฒนาในสภาพแวดล้อมเทคโนโลยีที่เปลี่ยนแปลงอย่างรวดเร็ว

1 ความคิดเห็น

 
GN⁺ 2024-01-22
ความคิดเห็นจาก Hacker News
  • We've implemented many common commands and features like globbing, environment variables, redirection, piping, and more.

    • การทำเชลล์แบบใหม่นี้มีคำสั่งและความสามารถทั่วไปหลายอย่างรวมอยู่แล้ว เช่น globbing, ตัวแปรสภาพแวดล้อม, redirection, piping เป็นต้น
    • แต่ยังไม่ค่อยมั่นใจเรื่องความเข้ากันได้กับเชลล์และการติดตั้ง coreutils ที่มีอยู่เดิม
    • ยังไม่ชัดเจนว่าตั้งเป้าความเข้ากันได้กับมาตรฐาน POSIX หรือ Bourne shell หรือไม่ และรองรับส่วนขยายของ GNU มากน้อยแค่ไหน
    • ยังขาดรายละเอียดเกี่ยวกับกรณีที่ระบบมี GNU coreutils อยู่แล้ว และเมื่อเพิ่มคำสั่งแบบ built-in ในอนาคตจะเกิดการเปลี่ยนแปลงที่ไม่คาดคิดหรือไม่
    • ชี้ว่าการแทนที่เชลล์ที่เข้ากันได้กับ Bourne อย่าง ZShell ด้วยเชลล์นี้ ไม่น่าจะเป็นสิ่งที่พึงประสงค์ในสถานการณ์ส่วนใหญ่
    • ใน ecosystem ของ JS นั้น จำเป็นต้องเขียนคำสั่งให้เข้ากันได้กับเชลล์หลากหลายแบบอยู่แล้ว ดังนั้นการทำให้ส่วนย่อยที่มีประโยชน์ของ Bourne-compatible shell กลายเป็นมาตรฐาน อาจทำให้ได้พฤติกรรมที่เกือบเข้ากันได้ 100% กับสิ่งที่ใช้งานได้อยู่แล้วบนแทบทุกแพลตฟอร์ม พร้อมทั้งทำงานได้ตรงตามตั้งใจในทุกแพลตฟอร์ม
  • Love that bun just implements anything that could be useful.

    • ชื่นชอบที่ Bun ลงมือทำทุกอย่างที่น่าจะมีประโยชน์
  • This looks exactly like zx by Google. And that's probably a good thing.

    • การทำเชลล์นี้ดูคล้าย zx ของ Google มาก และนั่นก็น่าจะเป็นเรื่องที่ดี
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • ชี้ว่าบน Arch Linux นั้น /bin/sh เป็น symbolic link ไปยัง bash ดังนั้นสิ่งที่วัดจึงเป็นอย่างเดียวกันจริง ๆ
    • บนระบบอย่าง Debian นั้น /bin/sh คือ dash ซึ่งเปิดตัวและโดยทั่วไปทำงานได้เร็วกว่า bash หลายเท่า
  • I work on Bun - happy to answer any questions/feedback

    • ในฐานะผู้พัฒนา Bun พร้อมตอบคำถามหรือรับฟัง 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.

    • จุดแข็งของ shell scripting คือช่วยให้จัดการยูทิลิตีอิสระหลายตัวได้ง่าย โดยไม่จำเป็นต้องถูกรวมอยู่ใน shell stdlib แต่ในเชลล์ใหม่นี้กลับมองไม่ค่อยเห็นการเน้นจุดนั้น
    • อีกทั้งการฝังภาษาหนึ่งเป็นสตริงอยู่ภายในอีกภาษาหนึ่ง แทบไม่เคยเป็นประสบการณ์ผู้ใช้ที่ดีนัก
    • อย่างไรก็ตาม ความสามารถในการพกพาของเชลล์นี้ช่วยแก้ปัญหาใหญ่ได้จริง
  • 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!

    • แนะนำไลบรารี JS ยอดนิยม Execa[1] สำหรับผู้ที่ต้องการสิ่งที่ทำงานได้บนทุก JS runtime (Deno, Node) และให้ความสามารถแทบจะเหมือนกัน ใช้งานได้ดีมาก
  • Another alternative is the ZX shell[2] JS library. Tho haven't tested it.

    • อีกทางเลือกหนึ่งคือไลบรารี JS ชื่อ ZX shell[2] แต่ยังไม่ได้ลองทดสอบ
  • 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 มาก ตอนนี้ไม่ใช้ Node สำหรับการพัฒนาแล้ว แทบไม่มีจุดให้สะดุดอีกต่อไป และเร็วกว่าโดยรวม โดยเฉพาะ bun test แนะนำอย่างยิ่ง ขอบคุณ @Jarred!
  • I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:

    • เพิ่งรู้ว่าใน JS สามารถเรียกใช้ฟังก์ชันโดยไม่ต้องมีวงเล็บได้ด้วยการใช้ backtick (`) เช่น Bun เองก็ใช้ฟังก์ชันเครื่องหมายดอลลาร์ ($) เพื่อรันคำสั่งเชลล์ ซึ่งเป็นหนึ่งในลูกเล่นทางไวยากรณ์แปลก ๆ ของ JS
  • Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.

    • เยี่ยมมาก มันกำลังเข้าใกล้ ergonomics ที่ Perl มอบให้มาหลายทศวรรษแล้ว และ Perl ก็ยังทำได้ดีกว่าอยู่ดี