सरल कंपाउंड कमांड्स—जैसे कमांड लाइन पर कई कमांड्स को एक क्रम में एक साथ स्ट्रिंग करना—अक्सर उपयोग किए जाते हैं। ऐसी कमांड्स सेमीकॉलन द्वारा अलग की जाती हैं, जो एक कमांड के अंत को परिभाषित करती हैं। एक ही लाइन पर शेल कमांड्स की एक साधारण श्रृंखला बनाने के लिए, बस प्रत्येक कमांड को सेमीकॉलन का उपयोग करके अलग करें, जैसे:
command1 ; command2 ; command3 ; command4 ; आपको अंतिम सेमीकॉलन जोड़ने की आवश्यकता नहीं है क्योंकि Enter कुंजी दबाने से अंतिम कमांड के अंत का तात्पर्य होता है, लेकिन निरंतरता के लिए इसे जोड़ना ठीक है।
सभी कमांड्स बिना किसी समस्या के चलेंगी—जब तक कोई त्रुटि न हो। लेकिन क्या होता है अगर कोई त्रुटि होती है? हम Bash में बने && और || कंट्रोल ऑपरेटर्स का उपयोग करके त्रुटियों का अनुमान लगा सकते हैं और अनुमति दे सकते हैं। ये दो कंट्रोल ऑपरेटर्स कुछ फ्लो कंट्रोल प्रदान करते हैं और हमें कोड-निष्पादन अनुक्रम को बदलने में सक्षम बनाते हैं। सेमीकॉलन और न्यूलाइन कैरेक्टर को भी Bash कंट्रोल ऑपरेटर्स माना जाता है।
&& ऑपरेटर बस कहता है "यदि command1 सफल है, तो command2 चलाएं।" यदि command1 किसी भी कारण से विफल होता है, तो command2 नहीं चलेगा। वह सिंटैक्स इस तरह दिखता है:
command1 && command2यह काम करता है क्योंकि हर कमांड शेल को एक कोड लौटाता है जो इंगित करता है कि यह सफलतापूर्वक पूरा हुआ या निष्पादन के दौरान विफल हुआ। कन्वेंशन द्वारा, 0 (शून्य) का रिटर्न कोड (RC) सफलता दर्शाता है और कोई भी पॉजिटिव नंबर किसी प्रकार की विफलता दर्शाता है। कुछ सिसएडमिन टूल्स किसी भी विफलता को इंगित करने के लिए सिर्फ 1 लौटाते हैं, लेकिन कई विफलता के प्रकार को इंगित करने के लिए अन्य पॉजिटिव न्यूमेरिकल कोड्स का उपयोग करते हैं।
Bash शेल का $? वेरिएबल स्क्रिप्ट द्वारा, कमांड्स की सूची में अगली कमांड द्वारा, या यहां तक कि सीधे एक सिसएडमिन द्वारा बहुत आसानी से जांचा जा सकता है। आइए RCs को देखें। हम एक साधारण कमांड चला सकते हैं और तुरंत RC की जांच कर सकते हैं, जो हमेशा अंतिम कमांड से संबंधित होगा जो चला।
[student@studentvm1 ~]$ ll ; echo "RC = $?"
total 284
-rw-rw-r-- 1 student student 130 Sep 15 16:21 ascii-program.sh
drwxrwxr-x 2 student student 4096 Nov 10 11:09 bin
<snip>
drwxr-xr-x. 2 student student 4096 Aug 18 10:21 Videos
RC = 0
[student@studentvm1 ~]$
यह RC 0 है, जिसका अर्थ है कि कमांड सफलतापूर्वक पूरा हुआ। अब उसी कमांड को एक डायरेक्ट्री पर आज़माएं जहां हमारे पास परमिशन नहीं है।
[student@studentvm1 ~]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 ~]$
इस RC का अर्थ ls कमांड के मैन पेज में पाया जा सकता है।
आइए && कंट्रोल ऑपरेटर को आज़माएं जैसा कि इसे कमांड-लाइन प्रोग्राम में उपयोग किया जा सकता है। हम कुछ सरल से शुरू करेंगे: एक नई डायरेक्ट्री बनाएं और, यदि वह सफल है, तो उसमें एक नई फ़ाइल बनाएं।
हमें एक डायरेक्ट्री की आवश्यकता है जहां हम अन्य डायरेक्ट्रीज बना सकें। सबसे पहले, अपनी होम डायरेक्ट्री में एक अस्थायी डायरेक्ट्री बनाएं जहां आप कुछ टेस्टिंग कर सकें।
[student@studentvm1 ~]$ cd ; mkdir testdir~/testdir में एक नई डायरेक्ट्री बनाएं, जो खाली होनी चाहिए क्योंकि आपने इसे अभी बनाया है, और फिर उस नई डायरेक्ट्री में एक नई, खाली फ़ाइल बनाएं। निम्न कमांड उन कार्यों को करेगा।
[student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1
[student@studentvm1 ~]$ ll ~/testdir/testdir2/
total 0
-rw-rw-r-- 1 student student 0 Nov 12 14:13 testfile1
[student@studentvm1 ~]$
हम जानते हैं कि सब कुछ वैसे ही काम करता है जैसा होना चाहिए क्योंकि testdir डायरेक्ट्री एक्सेसिबल और राइटेबल है। testdir पर परमिशन बदलें ताकि यह यूजर student के लिए अब एक्सेसिबल न हो:
[student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
d---rwxrw-. 3 student student 4096 Nov 12 14:13 testdir
[student@studentvm1 ~]$
grep कमांड का उपयोग लॉन्ग लिस्ट (ll) के बाद testdir की लिस्टिंग दिखाता है। आप देख सकते हैं कि यूजर student की अब testdir डायरेक्ट्री तक पहुंच नहीं है। अब आइए लगभग वही कमांड चलाएं लेकिन इसे testdir के अंदर एक अलग डायरेक्ट्री नाम बनाने के लिए बदलें।
[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1
mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
[student@studentvm1 ~]$
हालांकि हमें एक एरर मैसेज मिला, && कंट्रोल ऑपरेटर का उपयोग touch कमांड को चलने से रोकता है क्योंकि testdir3 बनाने में एक त्रुटि थी। इस प्रकार का कमांड-लाइन लॉजिकल फ्लो कंट्रोल त्रुटियों को कंपाउंड होने और चीजों का एक वास्तविक गड़बड़ बनाने से रोक सकता है। लेकिन आइए इसे थोड़ा और जटिल बनाएं।
|| कंट्रोल ऑपरेटर हमें एक और कमांड जोड़ने की अनुमति देता है जो तब निष्पादित होती है जब प्रारंभिक प्रोग्राम स्टेटमेंट शून्य से बड़ा कोड लौटाता है।
[student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 || echo "An error occurred while creating the directory."
mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
An error occurred while creating the directory.
[student@studentvm1 ~]$
कंट्रोल ऑपरेटर्स का उपयोग करके हमारे कंपाउंड कमांड सिंटैक्स का यह सामान्य रूप लेता है जब हम && और || कंट्रोल ऑपरेटर्स का उपयोग करते हैं:
preceding commands ; command1 && command2 || command3 ; following commandsकंट्रोल ऑपरेटर्स का उपयोग करने वाला कंपाउंड कमांड अन्य कमांड्स से पहले और बाद में हो सकता है जो फ्लो-कंट्रोल सेक्शन में वालों से संबंधित हो सकते हैं लेकिन जो फ्लो कंट्रोल से अप्रभावित हैं। उन सभी कमांड्स को फ्लो-कंट्रोल कंपाउंड कमांड के अंदर जो कुछ भी होता है उसकी परवाह किए बिना निष्पादित किया जाएगा।
ये फ्लो-कंट्रोल ऑपरेटर्स निर्णयों को संभालकर और हमें यह बताकर कि कब कोई समस्या हुई है, कमांड लाइन पर काम करना अधिक कुशल बना सकते हैं। मैं उन्हें सीधे कमांड लाइन पर और साथ ही स्क्रिप्ट्स में उपयोग करता हूं।
आप रूट यूजर के रूप में डायरेक्ट्री और उसकी सामग्री को हटाकर साफ कर सकते हैं।
[root@studentvm1 ~]# rm -rf /home/student/testdirआप Bash कंट्रोल ऑपरेटर्स का उपयोग कैसे करते हैं? हमें टिप्पणी अनुभाग में बताएं।