- เรียกใช้ 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 ความคิดเห็น
ความคิดเห็นจาก 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/shเป็น symbolic link ไปยัง bash ดังนั้นสิ่งที่วัดจึงเป็นอย่างเดียวกันจริง ๆ/bin/shคือ dash ซึ่งเปิดตัวและโดยทั่วไปทำงานได้เร็วกว่า bash หลายเท่า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แนะนำอย่างยิ่ง ขอบคุณ @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.