मैं कंसोल पर चेन कमांड कैसे कर सकता हूं?


23

में bash, मैं कभी कभी धारावाहिक में कई आदेशों को चलाने के लिए चाहते हैं और इससे पहले कि मैं नए लोगों को टाइप समाप्त करने के लिए उनके लिए इंतजार नहीं करना चाहते हैं। तो मैं कुछ इस तरह से:

cmd1; cmd2; cmd3

दुर्भाग्य से, कोई भी आदेश विफल हो सकता है। उस स्थिति में, मैं रोकना चाहूंगा। क्या ऐसा करने का एक आसान तरीका है, लेकिन इसे इतना बनाओ कि मैं केवल कमांड को चालू रखूं अगर पिछली कमांड में 0 एक्जिट कोड था?


यहां यूनिक्स एसई का एक शानदार जवाब है।
NonlinearFruit

जवाबों:


39

&&ऑपरेटर का उपयोग करें ,

cmd1 && cmd2 && cmd3

शेल्स्क्रिप्टिंग में, &&और ||ऑपरेटरों को सी। &&मतलब और ऑपरेटर, और ||साधन OR में तार्किक ऑपरेटरों के अनुकूलित कार्यान्वयन के बाद मॉडलिंग की जाती है । यूनिक्स कसकर सी से संबंधित है, और सी में, तार्किक ऑपरेटरों के दूसरे ऑपरेंड का मूल्यांकन नहीं किया जाता है यदि परिणाम पहले से पहले ऑपरेंड से जाना जाता है। उदाहरण के लिए "false && x"है falseकिसी के लिए xहै, तो मूल्यांकन करने के लिए कोई जरूरत नहीं है x(खासकर अगर xएक समारोह कॉल है); इसी तरह के लिए "true || x"। इसे शॉर्ट-सर्क्युटिंग शब्दार्थ भी कहा जाता है ।

और यूनिक्स में, कमांड के रिटर्न मानों को "सफल समापन" सत्य मूल्यों के रूप में व्याख्या करना पारंपरिक है: एक्जिट कोड 0 का मतलब true(सफलता), नॉनजरो का मतलब false(असफलता)। इसलिए, जब cmd1 && cmd2रिटर्न में पहला कमांड "false"(नॉनज़ेरो एग्जिट स्टेटस, जो विफलता को इंगित करता है), कंपाउंड कमांड की स्थिति ज्ञात है: विफलता। तो समग्र व्याख्या cmd1 && cmd2 हो सकती है: "निष्पादित करें cmd1, और फिर, अगर यह विफल नहीं हुआ, cmd2"। जो आप मूल रूप से अपने प्रश्न में चाहते हैं।

इसी तरह से OR: की cmd1 || cmd2व्याख्या "निष्पादित cmd1, या अगर यह विफल रहता है, cmd2" के रूप में की जा सकती है ।


Protip: लंबी श्रृंखला के लिए &&, set -eअपनी स्क्रिप्ट में डालने पर विचार करें। यह मूल रूप से अर्धविराम ;को &&कुछ विशेष मामलों के साथ बदल देता है।


1
+1 समझाने के लिए||
अल्प

जो भी पहले कमांड की स्थिति है, क्या आप चेन कर सकते हैं? (सफलता या असफलता)
ह्यूगो ट्रेंटेसाक्स

@HugoTrentesaux का क्या मतलब है? .. सफलता / असफलता परिणाम या A || Bकेवल [लघु-परिशोधन] तार्किक A OR B के समान हैA || Bहै सफलता जब Aथा सफलता , या जब Aथा विफलता लेकिन Bथा सफलता ; और A || Bहै विफलता जब Aथा विफलता और Bथा failure। इसी तरह &&, यह तार्किक और इस प्रकार है।
ulidtko

शेल के संदर्भ में, मैं ए को कैसे निष्पादित कर सकता हूं और फिर बी को कोई फर्क नहीं पड़ता अगर ए विफल या सफल होता है?
ह्यूगो ट्रेंटेसाक्स

1
@HugoTrentesaux कि प्लेन रेगुलर ;(या न्यूलाइन) डिफ़ॉल्ट रूप से क्या करता है। set -eमें बदल ;जाएगा &&, मोटे तौर पर बोल रहा हूँ। set +e[डिफ़ॉल्ट] A; Bआपके कहे अनुसार चलता है: चलाएं A, फिर कोई बात नहीं B
ulidtko

13

"चेनिंग कमांडिंग द ग्रुपिंग ए उन्हें"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

पिंग्स, केवल यदि सफल नहीं होते हैं, तो कोष्ठक में कमांड के जंजीर समूह को निष्पादित करता है।

ध्यान:

सूची को ";" के साथ समाप्त किया जाना है।

ब्रैकेट और समूहीकृत कमांड के बीच रिक्त स्थान होना चाहिए!


6

बस &&ऑपरेटर के साथ । उदाहरण के लिए:

cmd1 && cmd2 && cmd3

यदि कोई एक आदेश विफल रहता है (0 से बाहर निकलने का मान लौटाता है), तो अन्य कमांड नहीं चलेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.