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


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

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

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

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

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

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

332
2017-08-20 16:41


मूल


एक और कनेक्टर है जिसे आप पार नहीं कर सकते हैं: ||के समान है && सिवाय इसके कि यह केवल दूसरा आदेश निष्पादित करता है यदि पहला गैर-शून्य (असफल) स्थिति से बाहर निकलता है। - Kaya
यह भी ध्यान रखें कि अपनी स्क्रिप्ट को साथ चलाना set -e विफलता पर स्क्रिप्ट को रोक देगा जैसे सभी आदेश जुड़े थे &&। - choroba
stackoverflow.com/questions/3573742/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
किसी ने भी क्यूएन 4 का उत्तर नहीं दिया ... मुझे && और || के व्यवहार पर संदेह है सी प्रोग्रामिंग भाषा से प्रेरित था। (X && y) के मामले में, यदि x झूठे का मूल्यांकन करता है, तो संपूर्ण अभिव्यक्ति झूठी होनी चाहिए ताकि एक कंपाइलर वाई के मूल्यांकन को अनुकूलित कर सके, यदि यह महंगा था। वास्तव में आधुनिक सी और सी ++ मानकों की आवश्यकता होती है यह अनुकूलन, इसलिए प्रोग्राम सुरक्षित रूप से यह मान सकते हैं कि x का गलत मूल्यांकन होने पर मूल्यांकन नहीं किया जाएगा। उदाहरण के लिए, (पीआरटी और& ptr-> दिन> 31) पीआरटी शून्य होने पर भी क्रैश नहीं होगा। सी में भी, बयान के साथ समाप्त होता है; इस पर ध्यान दिए बिना कि एक ही पंक्ति पर एक और बयान है या नहीं। - Kevin


जवाब:


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

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.

608
2017-10-20 11:02



और निश्चित रूप से, A & B &: पृष्ठभूमि में ए चलाएं, फिर पृष्ठभूमि में बी चलाएं (सफलता के बावजूद) और खोल पर नियंत्रण वापस करें। यह अक्सर एक ही समय में दोनों प्रक्रियाओं को चलाने के समान ही काम करता है। - Limited Atonement
क्या यह कहना संभव है: पृष्ठभूमि में चलाएं, उसके बाद पृष्ठभूमि में बी केवल तभी काम करें? ( मेरा अनुमान &&& ?) - user230910
@ user230910: वह होगा (A && B) &। - leftaroundabout
क्या आप इसके लिए आधिकारिक दस्तावेज का संदर्भ दे सकते हैं? - Jaime Hablutzel
@ जैक जब क्रोनबॉज से निष्पादित किया गया, तो यह इस नियम का पालन नहीं करता है, कोई विचार क्यों? एक अजगर फ़ाइल के लिए - CodeGuru


&& यदि स्थिति 0 (सफल हुआ) के साथ बाहर निकला तो पहला आदेश केवल तभी चलाता है। ; दोनों आज्ञाओं को चलाता है, भले ही पहला शून्य शून्य स्थिति से बाहर निकलता हो।

के साथ आपका उदाहरण && समकक्ष रूप से paraphrased किया जा सकता है

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

77
2017-08-20 16:46



धन्यवाद। मैंने यह सुनिश्चित करने के लिए प्रश्न को अद्यतन किया है कि अलग-अलग सबक्वेशन आसानी से भिन्न हो सकते हैं। - don.joey
@ निजी: आपको उपयोग करना चाहिए ; यदि दूसरे आदेश को सफल होने के लिए पिछले व्यक्ति की आवश्यकता नहीं है। - choroba


का उपयोग करते हुए ; चाहे आदेश कमांड सफल हो या नहीं, भले ही आदेशों को निष्पादित किया जाए।

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

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

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

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

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


28
2017-08-20 16:50



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


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

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

चौथे प्रश्न के लिए: वे बैश वाक्यविन्यास हैं

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


13
2017-08-20 21:05