10 पॉइंट द्वारा GN⁺ 2024-01-22 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 टिप्पणियां

 
GN⁺ 2024-01-22
Hacker News टिप्पणियाँ
  • हमने globbing, environment variables, redirection, piping जैसी कई सामान्य commands और features इम्प्लीमेंट की हैं, और भी बहुत कुछ।

    • नए shell implementation में सामान्य commands और features (globbing, environment variables, redirection, piping आदि) शामिल हैं।
    • लेकिन, मौजूदा shell और coreutils implementations के साथ compatibility को लेकर भरोसा कम है।
    • यह स्पष्ट नहीं है कि क्या लक्ष्य POSIX standard या Bourne shell compatibility है, और GNU extensions का support है या नहीं।
    • जब system में GNU coreutils मौजूद हों, तब क्या होगा, और आगे built-in commands जोड़ने पर क्या unexpected changes हो सकते हैं, इस बारे में पर्याप्त विवरण नहीं है।
    • यह बताया गया है कि ZShell जैसे Bourne-compatible shell को इस shell से बदलना अधिकांश स्थितियों में वांछनीय नहीं होगा।
    • JS ecosystem में पहले से ही ऐसे commands लिखने पड़ते हैं जो अलग-अलग shells के साथ compatible हों, इसलिए Bourne-compatible shell के उपयोगी subset को standardize करना ऐसा रास्ता हो सकता है जो लगभग 100% compatibility बनाए रखते हुए, अधिकांश platforms पर पहले से काम करने वाली चीज़ों के साथ मेल खाए और सभी platforms पर इच्छित रूप से काम करे।
  • अच्छा लगता है कि Bun ऐसी हर चीज़ इम्प्लीमेंट करता है जो उपयोगी हो सकती है।

    • Bun उपयोगी हो सकने वाली हर चीज़ इम्प्लीमेंट करता है, इसे सकारात्मक रूप से देखा गया है।
  • यह बिल्कुल Google के zx जैसा दिखता है। और शायद यह अच्छी बात है।

    • यह shell implementation Google के zx से बहुत मिलता-जुलता लगता है। यह अच्छी बात हो सकती है।
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • यह इंगित किया गया है कि Arch Linux में /bin/sh, bash का symbolic link है, इसलिए वास्तव में एक ही चीज़ को मापा जा रहा है।
    • Debian जैसे systems में /bin/sh, dash होता है, जो startup और सामान्य performance में bash से कई गुना तेज़ है।
  • मैं Bun पर काम करता हूँ - किसी भी सवाल/feedback का जवाब देने में खुशी होगी

    • Bun developer के रूप में, सवालों या feedback का जवाब देने के लिए तैयार हैं।
  • यह बढ़िया है, लेकिन a) मुझे लगता है कि shell scripting की ताकत इस बात में है कि यह कई स्वतंत्र utilities को आसानी से संभालने देती है, जिन्हें shell stdlib के भीतर समाहित होने की ज़रूरत नहीं होती (हो सकता है मैं कुछ मिस कर रहा हूँ, लेकिन मुझे उस पर कोई ज़ोर नहीं दिखा), और b) किसी एक language को दूसरी language के भीतर string के रूप में embed करना बहुत कम ही अच्छा UX होता है।

    • shell scripting की असली ताकत कई स्वतंत्र utilities को आसानी से संभालने में है, लेकिन इस नए shell में उस पहलू पर ज़ोर कम दिखता है।
    • एक language को दूसरी language के अंदर string के रूप में embed करना अच्छा user experience नहीं माना गया है।
    • हालांकि, इस shell की portability वास्तव में एक बड़ी समस्या हल करती है।
  • जो चीज़ सभी JS runtimes (Deno, Node) में काम करती है और लगभग वही हासिल करती है, उसके लिए लोकप्रिय JS library Execa[1] देखें। बेहतरीन काम करती है!

    • Execa[1] JS library की सिफारिश की गई है, जो सभी JS runtimes (Deno, Node) में काम करती है और मूलतः वही functionality देती है।
  • एक और विकल्प ZX shell[2] JS library है। हालांकि, मैंने इसे test नहीं किया है।

    • ZX shell[2] JS library भी एक विकल्प हो सकती है, लेकिन इसे test नहीं किया गया है।
  • मुझे Bun बहुत पसंद है। मैं अब development के लिए Node इस्तेमाल नहीं करता। अब मुश्किल से कोई gotchas बची हैं। यह हर तरफ़ से ज़्यादा तेज़ है। खासकर bun test। ज़ोरदार सिफारिश है। धन्यवाद @Jarred!

    • Bun को बहुत पसंद किया गया है, और development में अब Node का उपयोग नहीं किया जाता। अब लगभग कोई समस्या नहीं आती और यह कुल मिलाकर तेज़ है। खासकर bun test बहुत तेज़ है। इसे मज़बूती से recommend किया गया है।
  • मुझे पता नहीं था, लेकिन लगता है कि आप JS में parentheses के बिना backticks (`) का इस्तेमाल करके function execute कर सकते हैं, जैसे:

    • यह पता चला कि JS में backticks (`) का उपयोग करके function को parentheses के बिना execute किया जा सकता है। Bun भी shell commands चलाने के लिए dollar sign ($) function का उपयोग करता है, जो JS के अजीब syntax magic में से एक है।
  • बढ़िया, यह अब उस ergonomics के करीब पहुँच रहा है जो Perl दशकों से देता आ रहा है। और Perl अभी भी इसे बेहतर करता है।

    • इस shell को दशकों से Perl द्वारा दी जा रही ergonomics के करीब माना गया है। और यह भी आंका गया है कि Perl अभी भी इसे बेहतर करता है।