कौन सा बेहतर है: उपयोग करना; या && एक पंक्ति में कई कमांड निष्पादित करने के लिए?


427

ट्यूटोरियल में और मैं-से कैसे अक्सर कमांड को संयुक्त रूप से देखता हूं। उदाहरण के लिए,

sudo apt-get update && sudo apt-get install pyrenamer

चार संभावित कनेक्टर्स होने लगते हैं: &, &&, ||और ;। हालांकि & कनेक्टर मेरे लिए स्पष्ट है (यह पृष्ठभूमि के लिए एक प्रक्रिया भेजता है और उपलब्ध टर्मिनल को छोड़ देता है), यह स्पष्ट नहीं है कि अंतर &&और क्या है ;। और मुझे ||काया की टिप्पणी तक का पता नहीं था ।

निम्नलिखित प्रश्न दो कनेक्टरों के बीच के अंतर से निपटते हैं, लेकिन ऐसा ज्यादातर टिप्पणियों में करते हैं:

तो यहाँ कई संबंधित प्रश्न हैं:

  1. बीच क्या अंतर है ;और &&?
  2. आपको उन्हें क्रमशः कब उपयोग करना चाहिए ? कुछ उपयोग के मामलों को देखना अच्छा होगा: अगर मैं एक कमांड चलाना चाहता हूं और फिर इसके बाद अपने कंप्यूटर को बंद कर दूं, तो मुझे कौन सा कनेक्टर चुनना चाहिए?
  3. उनके फायदे और खतरे क्या हैं ? रोबी बसाक ने इस उत्तर के लिए एक टिप्पणी में उल्लेख किया है कि cd /somewhere_else; rm -Rf *यदि कमांड श्रृंखला में पहला तत्व विफल रहता है, तो उदाहरण के लिए एक कमांड जैसा विनाशकारी परिणाम हो सकता है।
  4. यदि प्रासंगिक है, तो वे कहां से आते हैं?

7
एक और कनेक्टर कि आपके सामने आने वाले नहीं हो सकता है: ||के रूप में ही है &&सिवाय इसके कि यह केवल दूसरा आदेश निष्पादित करता है, तो पहले एक एक गैर शून्य (असफल) की स्थिति के साथ बाहर निकल गया।
काया

4
यह भी ध्यान दें कि आपकी स्क्रिप्ट के साथ चलने set -eसे स्क्रिप्ट विफलता पर बंद हो जाएगी जैसे कि सभी आदेशों के साथ जुड़ा हुआ था &&
कोरोबा


3
किसी ने भी Qn 4 का जवाब नहीं दिया ... मुझे && और || के व्यवहार पर संदेह है सी प्रोग्रामिंग भाषा से प्रेरित था। (X && y) के मामले में, यदि x गलत का मूल्यांकन करता है, तो पूरी अभिव्यक्ति झूठी होनी चाहिए, इसलिए एक कंपाइलर y के मूल्यांकन को अनुकूलित कर सकता है, यदि यह महंगा था। आधुनिक सी और सी ++ मानकों को वास्तव में इस अनुकूलन की आवश्यकता होती है, इसलिए प्रोग्राम सुरक्षित रूप से मान सकते हैं कि यदि x गलत है तो y का मूल्यांकन नहीं किया जाएगा। उदाहरण के लिए, (ptr && ptr-> days> 31) भले ही ptr अशक्त न हो। सी में भी, बयान के साथ समाप्त होता है; इस बात पर ध्यान दिए बिना कि एक ही लाइन पर एक और बयान है या नहीं।
केविन

जवाबों:


771

प्रवंचक पत्रक:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

19
और निश्चित रूप से A & B &: पृष्ठभूमि में ए चलाएं, फिर बी को पृष्ठभूमि में चलाएं (सफलता की परवाह किए बिना) और शेल पर नियंत्रण वापस करें। यह अक्सर एक ही समय में दोनों प्रक्रियाओं को चलाने के समान के बारे में काम करता है।
सीमित प्रायश्चित

4
क्या यह कहना संभव है: एक पृष्ठभूमि में चलाओ, उसके बाद पृष्ठभूमि में बी केवल तभी काम करेगा? (मुझे लगता है कि &&&?)
user230910

14
@ user230910: यह होगा (A && B) &
लेफ्टनैबाउटआउट

5
क्या आप इसके लिए आधिकारिक दस्तावेज का संदर्भ ले सकते हैं?
Jaime Hablutzel

@Jack जब क्रोनजोब से निष्पादित किया जाता है, तो यह इस नियम का पालन नहीं करता है, किसी भी विचार क्यों? एक अजगर फाइल के लिए
कोडगुरु

77

&&केवल दूसरा कमांड चलाता है अगर पहले वाला स्टेटस 0 से बाहर निकला (सफल रहा)। ;दोनों कमांड चलाता है, भले ही पहले एक गैर शून्य स्थिति के साथ बाहर निकलता है।

के साथ आपके उदाहरण के &&रूप में बराबर paraphrased जा सकता है

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

धन्यवाद। मैंने यह सुनिश्चित करने के लिए प्रश्न को अपडेट किया है कि विभिन्न उपविभाजन आसानी से अलग-अलग हैं।
don.joey

5
@ मुख्य: आपको उपयोग करना चाहिए ;यदि दूसरे कमांड को सफल होने के लिए पिछले एक की आवश्यकता नहीं है।
चोरोबा

31

का उपयोग ;कर आदेशों पर अमल करेगा चाहे वह पहला आदेश सफल हो या न हो।

का उपयोग करते हुए &&2 आदेश केवल जब पहली आदेश सफलतापूर्वक निष्पादित (स्थिति 0) निष्पादित करें।

दोनों का उपयोग अलग-अलग दृष्टिकोण से किया जाता है। एक लंबी प्रक्रिया की तरह, एक संस्थापन के लिए कहें जिसे आपको संकलित करने और स्थापित करने की आवश्यकता है। आपको चाहिए make && make install। इसलिए इंस्टॉल makeसफल होने पर ही चलेगा ।

तो आश्रित आदेशों के लिए आपको उपयोग करना चाहिए &&

राइटिंग बैश, या स्वतंत्र कमांड के साथ कमांड का उपयोग ;

इसलिए यदि आप कंप्यूटर को बंद करना चाहते हैं तो भी पहली नौकरी का उपयोग विफल हो गया है ;, लेकिन यदि आप पहली नौकरी की पूरी सफलता चाहते हैं तो शटडाउन का उपयोग शुरू करें&&


14

a ; bएक के बाहर निकलने की स्थिति की परवाह किए बिना चलेंगे। a && bसफल होने पर ही b चलेगा।

पहले 3 प्रश्नों के उत्तर के लिए यह आवश्यक और पर्याप्त है। विशेष रूप से, 2 बहुत व्यापक है, और "एक" निश्चित उत्तर नहीं दिया जा सकता है - आपका सबसे अच्छा शर्त यह है कि केस के आधार पर केस तय किया जाए।

4 वें प्रश्न के लिए: वे बैश सिंटैक्स हैं

दोनों के उपयोग में कोई आंतरिक खतरा नहीं है। फिर, उपरोक्त परिभाषा पर्याप्त है। इसका तात्पर्य यह है कि &&जब आप सफल नहीं होंगे bतो अनपेक्षित प्रभाव डालेंगे a। आईएमएचओ को आगे के नियमों या स्पष्टीकरण की कोई आवश्यकता नहीं है।


1

ए; B # रन A और फिर B, A की सफलता की परवाह किए बिना

A && B # रन B यदि और केवल तभी A सफल हुआ

ए || बी # रन बी अगर और केवल अगर ए विफल हो गया

पृष्ठभूमि में ए और # रन ए।

अंगूठे का एक बहुत अच्छा नियम। मुझे लगता है कि कुछ मामलों में, इन आदेशों का उपयोग एक उप-प्रकार में करना समझ में आता है जब हम उन्हें एक इकाई के रूप में विचार करना चाहते हैं या हम वर्तमान शेल के साथ कुछ संचालन परिणामों को युगल नहीं करना चाहते हैं।

उदाहरण:

दो आदेशों के उत्पादन को अलग करें:

(ls foo; ls bar) > single-result.txt

एक निर्देशिका में जा रहे हैं और शेल की वर्तमान निर्देशिका को नहीं बदलते हुए वहां से एक कमांड निष्पादित करते हैं:

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