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