Ubuntu dash शैल गाइड: तेज POSIX स्क्रिप्टिंग

dash का परिचय और मूलभूत संकल्पनाएं

Ubuntu जैसे आधुनिक लिनक्स वातावरण में बैकग्राउंड सिस्टम स्क्रिप्ट्स को तेज गति से प्रोसेस करने के लिए एक बेहद कॉम्पैक्ट शेल की आवश्यकता होती है। इसी कार्य के लिए डिफ़ॉल्ट रूप से dash (Debian Almquist Shell) को तैनात किया गया है, जो /bin/sh के पीछे प्राथमिक इंजन के रूप में कार्य करता है। यह टूल bash की तरह जटिल इंटरैक्टिव फीचर्स से भरा हुआ नहीं है, बल्कि पूरी तरह से POSIX मानकों और न्यूनतम रिसोर्स खपत पर केंद्रित है। इस गाइड के जरिए हम समझेंगे कि dash किस प्रकार काम करता है, bash से यह किन पैमानों पर अलग है, और इसके जरिए अत्यधिक कुशल सिस्टम स्क्रिप्ट्स कैसे तैयार की जाती हैं।

सिस्टम में डिफ़ॉल्ट शेल की जांच और dash वातावरण की पड़ताल

Ubuntu ऑपरेटिंग सिस्टम में /bin/sh किस वास्तविक बाइनरी की ओर इंगित कर रहा है, इसका पता लगाने के लिए सिम्बोलिक लिंक की स्थिति देखना सबसे पहला कदम है। इसके लिए टर्मिनल पर ls -l /bin/sh चलाएं।
आउटपुट स्पष्ट रूप से दर्शाता है कि सिस्टम का मुख्य शेल लिंक सीधे dash पर सेट है।

सिम्बोलिक लिंक की जांच

इसके उपरांत, हमें यह सुनिश्चित करना होगा कि पैकेज स्तर पर dash सही ढंग से संस्थापित है या नहीं। इसके सत्यापन हेतु dpkg -l | grep dash कमांड का उपयोग किया जाता है।
कंसोल पर दिखने वाला ii फ्लैग यह पुष्टि करता है कि पैकेज न केवल इंस्टॉल है बल्कि सिस्टम में ठीक से कॉन्फ़िगर भी है।

dash पैकेज स्थिति की जांच

अत्यंत तीव्र बूट टाइम और न्यूनतम मेमोरी यूसेज के उद्देश्य से गढ़े गए इस POSIX-अनुरूप शेल का परीक्षण करने के लिए हम dash -c के माध्यम से एक प्राथमिक कमांड पास करके देखते हैं।
⚙️ [उपयोगी कमांड ऑप्शन्स]

-c : दिए गए स्ट्रिंग आर्ग्युमेंट को शेल कमांड की तरह रन करता है।
-s : स्टैण्डर्ड इनपुट (stdin) से एक-एक करके निर्देश पढ़ता है और उन्हें प्रोसेस करता है।
-e : किसी भी कमांड के नॉन-ज़ीरो (एरर) स्टेटस लौटाते ही स्क्रिप्ट का निष्पादन रोक देता है।
-u : यदि किसी अपरिभाषित वेरिएबल को एक्सेस करने की कोशिश की जाए, तो तुरंत एरर थ्रो करता है।
-n : बिना कोड रन किए केवल सिंटैक्स त्रुटियों की जांच करता है।
-x : डिबगिंग के लिए प्रत्येक निष्पादित कमांड को स्क्रीन पर ट्रेस करता है।

dash कमांड निष्पादन परीक्षण

बिल्ट-इन कमांड्स और वेरिएबल हैंडलिंग का व्यावहारिक अभ्यास

अतिरिक्त प्रोसेस फोर्क करने से बचने के लिए शेल्स अपने सामान्य टूल्स को इंटरनल बिल्ट-इन के रूप में रखते हैं। dash में बुनियादी यूटिलिटीज़ किस रूप में मौजूद हैं, यह जांचने के लिए हम dash -c "type echo type pwd type cd" निष्पादित करते हैं।
परिणाम से साफ हो जाता है कि echo, type, pwd और cd सभी सीधे शेल के अंदर ही समाहित हैं, जिससे प्रोसेस निर्माण का ओवरहेड शून्य हो जाता है।

शेल बिल्ट-इन कमांड्स की पहचान

अगले चरण में यह परखना जरूरी है कि वेरिएबल डिक्लेरेशन और उनका विस्तार dash में सुचारू रूप से कार्य करता है या नहीं। इसके लिए dash -c "test_var='Linux Dash Practice'; echo \$test_var" चलाकर देखें।
टर्मिनल पर वेरिएबल में स्टोर की गई स्ट्रिंग बिना किसी समस्या के प्रिंट हो जाती है।

वेरिएबल असाइनमेंट और प्रिंटिंग

वर्तमान में रन हो रहे शेल एनवायरनमेंट की पहचान को प्रोग्रामेटिक रूप से वेरीफाई करने के लिए विशेष पैरामीटर $0 का सहारा लिया जाता है। dash -c "echo \$0" रन करके इस मान की जांच की जा सकती है।
आउटपुट के तौर पर dash मिलने से यह सत्यापित हो जाता है कि कोड ठीक उसी एनवायरनमेंट में एक्टिव है जिसकी हमें अपेक्षा थी।

सक्रिय शेल नाम की पुष्टि

मानक POSIX स्क्रिप्ट तैयार करना और उसका निष्पादन

व्यवस्थित रूप से स्क्रिप्टिंग अभ्यास करने के लिए सबसे पहले एक समर्पित डायरेक्टरी बनाएं और उसमें स्विच करें। इसके लिए mkdir -p ~/dash_practice && cd ~/dash_practice कमांड दर्ज करें।

अभ्यास डायरेक्टरी तैयार करना

अब हम एक बुनियादी लूप वाली स्क्रिप्ट posix_test.sh का निर्माण करेंगे, जो स्टैंडर्ड POSIX अंकगणितीय सिंटैक्स और while स्ट्रक्चर का पालन करती है।
शीर्ष पर दिए गए शेबैंग #!/bin/dash के माध्यम से सिस्टम को यह स्पष्ट निर्देश मिलता है कि इसे dash इंटरप्रेटर द्वारा ही चलाया जाए।

cat « ‘EOF’ > posix_test.sh
#!/bin/dash
count=1
while [ “$count” -le 3 ]; do
echo “Loop iteration: $count”
count=$((count + 1))
done
EOF

फाइल बनने के बाद उसे निष्पादन योग्य बनाने हेतु परमिशन अपडेट करनी होती है। chmod +x posix_test.sh कमांड से आवश्यक एग्जीक्यूट राइट्स जोड़ें।

एग्जीक्यूट परमिशन असाइन करना

अब स्क्रिप्ट को ./posix_test.sh टाइप करके चलाएं।
लूप लगातार तीन बार बिना किसी रुकावट के चलता है और काउंटर वैल्यूज क्रमिक रूप से स्क्रीन पर दिखाई देती हैं।

POSIX स्क्रिप्ट रन रिजल्ट

Bash बनाम Dash: परफ़ॉर्मेंस और निष्पादन गति की तुलना

गति और रिसोर्स मैनेजमेंट के वास्तविक अंतर को मापने के लिए हम अपने वर्कस्पेस में लौटते हैं: cd ~/dash_practice।

वर्कस्पेस में प्रवेश

दोनों शेल्स की लूपिंग क्षमता और अंकगणितीय गति की तुलना करने के लिए हम 50,000 पुनरावृत्तियों (iterations) वाली एक साधारण स्क्रिप्ट bench.sh तैयार करते हैं।

cat « ‘EOF’ > bench.sh
i=1
while [ “$i” -le 50000 ]; do
i=$((i + 1))
done
echo “Finished loop test”
EOF

सर्वप्रथम bash वातावरण के तहत इस कोड को प्रोसेस करने में लगने वाले कुल समय को time bash bench.sh से मापते हैं।
लूप पूरा होते ही टर्मिनल पर यूजर और सिस्टम सीपीयू टाइम का पूरा विवरण दर्ज हो जाता है।

bash बेंचमार्क टाइमिंग

इसके तुरंत बाद, वही कोड dash के जरिए चलाने के लिए time dash bench.sh कमांड एग्जीक्यूट करें।
अनावश्यक ब्लोट से मुक्त और केंद्रित संरचना होने के कारण dash इस कार्य को bash की तुलना में उल्लेखनीय रूप से कम समय में पूरा कर लेता है।

dash बेंचमार्क टाइमिंग

इस ट्यूटोरियल में हमने देखा कि Ubuntu का सिस्टम कोर dash पर इतना अधिक निर्भर क्यों है। इसकी पोर्टेबिलिटी, मानक-आधारित डिजाइन और अविश्वसनीय गति इसे बैकएंड स्क्रिप्ट्स और ऑटोमेशन टास्क के लिए एक आदर्श विकल्प बनाती है। जब भी अत्यधिक गति और न्यूनतम मेमोरी खपत की जरूरत हो, POSIX-अनुरूप dash स्क्रिप्ट्स का चयन करें।