- JavaScript/TypeScript से shell को कॉल करना आसान हो जाता है
- cross-platform होने की वजह से Linux/Windows/macOS सभी पर इस्तेमाल किया जा सकता है
- सामान्य commands और features को भीतर ही implement किया गया है: globbing, environment variables, redirection, piping
- दुनिया की सबसे लोकप्रिय scripting language होने के बावजूद, JavaScript में shell scripts चलाना मुश्किल रहा है.
child_process module के spawnSync function या fs/promises के readdir function से मिलते-जुलते काम किए जा सकते हैं, लेकिन यह पारंपरिक shell scripts जितना सरल नहीं है.
मौजूदा shell और JavaScript के compatibility issues
bash या sh जैसे shells दशकों से उपयोग में हैं, लेकिन JavaScript में ये ठीक से काम नहीं करते.
- macOS का
zsh, Linux का bash, और Windows का cmd अलग-अलग syntax और commands रखते हैं, जिससे compatibility problems पैदा होती हैं.
- npm अब तक उस तरीके पर निर्भर रहा है जिसमें community, JavaScript implementations के जरिए missing commands को भरती रही है.
Windows पर काम न करने वाले commands
rm -rf command Windows पर काम नहीं करती, इसलिए rimraf जैसी cross-platform JavaScript implementation को हर हफ्ते 6 करोड़ downloads मिलते हैं.
- environment variables सेट करने का तरीका platform के अनुसार अलग है, और Windows में
cross-env का उपयोग करना पड़ता है.
which command Windows में where के रूप में इस्तेमाल होती है, और इसके लिए बना package भी हर हफ्ते 6 करोड़ downloads पाता है.
shell startup time की समस्या
- shell शुरू होने में Linux x64 Hetzner Arch Linux मशीन पर लगभग 7ms लगते हैं.
- अगर सिर्फ एक command चलानी हो, तो shell startup time command execution time से भी ज़्यादा हो सकता है.
- loop में बहुत सारी commands चलाने पर यह overhead महंगा पड़ सकता है.
polyfill की ज़रूरत
- 2009 से 2016 तक, जब JavaScript अपेक्षाकृत नई और experimental थी, तब community द्वारा missing features को polyfill करना उचित था.
- लेकिन 2024 तक server पर JavaScript mature और व्यापक रूप से अपनाई जा चुकी है, और JavaScript ecosystem अब मौजूदा ज़रूरतों को पहले से बेहतर समझता है.
Bun Shell परिचय
- Bun Shell, Bun में built-in एक नई experimental language और interpreter है, जो JavaScript और TypeScript से cross-platform shell scripts चलाने की सुविधा देती है.
- Bun Shell के साथ JavaScript variables को shell scripts में इस्तेमाल किया जा सकता है, और सभी template variables को escape किया जाता है ताकि security बेहतर हो.
- Bun Shell सामान्य JavaScript जैसा महसूस होता है, और stdout को buffer या file में redirect किया जा सकता है या दूसरी commands में pipe किया जा सकता है.
cd, echo, rm जैसे built-in commands इस्तेमाल किए जा सकते हैं, और यह Windows, macOS, Linux पर काम करता है.
- Bun Shell को सरल shell scripts का विकल्प बनने के लिए डिज़ाइन किया गया है, और Windows पर Bun इस्तेमाल करते समय
package.json के "scripts" में bun run चलाता है.
- इसे एक standalone shell script interpreter के रूप में भी इस्तेमाल किया जा सकता है.
install करने का तरीका
- Bun Shell, Bun में built-in है, और अगर Bun v1.0.24 या उससे ऊपर install है, तो इसे तुरंत इस्तेमाल किया जा सकता है.
- अगर Bun install नहीं है, तो इसे curl या npm से install किया जा सकता है.
GN⁺ की राय
- Bun Shell, मौजूदा shell scripts और JavaScript के compatibility issues को हल करने के लिए एक अभिनव approach पेश करता है.
- cross-platform support और आसान उपयोग, developers को अलग-अलग environments में एक समान scripting experience देते हैं.
- ऐसे tools, JavaScript ecosystem की maturity को दर्शाते हैं और उम्मीद है कि तेज़ी से बदलते tech environment में developers की productivity बढ़ाने में मदद करेंगे.
1 टिप्पणियां
Hacker News टिप्पणियाँ
अच्छा लगता है कि Bun ऐसी हर चीज़ इम्प्लीमेंट करता है जो उपयोगी हो सकती है।
यह बिल्कुल Google के zx जैसा दिखता है। और शायद यह अच्छी बात है।
/bin/sh, bash का symbolic link है, इसलिए वास्तव में एक ही चीज़ को मापा जा रहा है।/bin/sh, dash होता है, जो startup और सामान्य performance में bash से कई गुना तेज़ है।मैं Bun पर काम करता हूँ - किसी भी सवाल/feedback का जवाब देने में खुशी होगी
यह बढ़िया है, लेकिन a) मुझे लगता है कि shell scripting की ताकत इस बात में है कि यह कई स्वतंत्र utilities को आसानी से संभालने देती है, जिन्हें shell stdlib के भीतर समाहित होने की ज़रूरत नहीं होती (हो सकता है मैं कुछ मिस कर रहा हूँ, लेकिन मुझे उस पर कोई ज़ोर नहीं दिखा), और b) किसी एक language को दूसरी language के भीतर string के रूप में embed करना बहुत कम ही अच्छा UX होता है।
जो चीज़ सभी JS runtimes (Deno, Node) में काम करती है और लगभग वही हासिल करती है, उसके लिए लोकप्रिय JS library Execa[1] देखें। बेहतरीन काम करती है!
एक और विकल्प ZX shell[2] JS library है। हालांकि, मैंने इसे test नहीं किया है।
मुझे Bun बहुत पसंद है। मैं अब development के लिए Node इस्तेमाल नहीं करता। अब मुश्किल से कोई gotchas बची हैं। यह हर तरफ़ से ज़्यादा तेज़ है। खासकर
bun test। ज़ोरदार सिफारिश है। धन्यवाद @Jarred!bun testबहुत तेज़ है। इसे मज़बूती से recommend किया गया है।मुझे पता नहीं था, लेकिन लगता है कि आप JS में parentheses के बिना backticks (`) का इस्तेमाल करके function execute कर सकते हैं, जैसे:
बढ़िया, यह अब उस ergonomics के करीब पहुँच रहा है जो Perl दशकों से देता आ रहा है। और Perl अभी भी इसे बेहतर करता है।