शेल कमांड में "&&" का उद्देश्य क्या है?


354

जहां तक ​​मुझे पता है, &कमांड के बाद का उपयोग करना पृष्ठभूमि में इसे चलाने के लिए है।

&उपयोग का उदाहरण :tar -czf file.tar.gz dirname &

पर कैसे &&? (इस उदाहरण को देखें: /server/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )

जवाबों:


398

&&आपको पिछले कमांड को सफलतापूर्वक पूरा करने के आधार पर कुछ करने देता है - इसलिए आप इसे जंजीर के रूप में देखते हैं do_something && do_something_else_that_depended_on_something


391

इसके अलावा, आपके पास ||वह भी है जो तार्किक है या, और वह भी ;सिर्फ एक विभाजक है जो परवाह नहीं करता है कि कमांड से पहले क्या हुआ।

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

इसके बारे में कुछ विवरण यहाँ बैश मैनुअल में कमांड्स ऑफ़ लिस्ट्स में देखे जा सकते हैं ।


5
शायद आप जोड़ना चाहेंगे false && echo "Will not be printed"
19

112

कमांड-लाइन - इसका उद्देश्य क्या है &&?

खोल में, जब तुम देखते हो

$ command one && command two

अभिप्राय उस कमांड को निष्पादित करना है जो &&केवल पहले कमांड के सफल होने पर अनुसरण करता है। यह पॉज़िक्स के गोले का मुहावरा है, न कि केवल बैश में।

यह पहली बार विफल होने पर दूसरी प्रक्रिया को चलाने से रोकने का इरादा रखता है।

आप देख सकते हैं कि मैंने "आशय" शब्द का उपयोग किया है - यह अच्छे कारण के लिए है। सभी कार्यक्रमों में समान व्यवहार नहीं होता है, इसलिए इसे काम करने के लिए, आपको यह समझने की आवश्यकता है कि कार्यक्रम "विफलता" को क्या मानता है और यह कैसे प्रलेखन को पढ़कर इसे संभालता है और यदि आवश्यक हो, तो स्रोत कोड।

आपका शेल सच के लिए 0 का रिटर्न मान मानता है, झूठे के लिए अन्य सकारात्मक संख्या

कार्यक्रम बाहर निकलने पर एक संकेत लौटाते हैं । यदि वे सफलतापूर्वक बाहर निकल जाते हैं या वे शून्य से अधिक हो जाते हैं तो उन्हें वापस लौटना चाहिए। यह प्रक्रियाओं के बीच सीमित मात्रा में संचार की अनुमति देता है।

&&कहा जाता है AND_IFमें POSIX खोल व्याकरण है, जो एक का हिस्सा है and_orसूची आदेशों की है, जो भी शामिल ||है जो एक है OR_IFसमान अर्थ विज्ञान के साथ।

व्याकरण प्रतीकों, प्रलेखन से उद्धृत:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

और व्याकरण (प्रलेखन से उद्धृत), जो दर्शाता है कि किसी भी संख्या में AND_IFs ( &&) और / या OR_IFs ( ||) को एक साथ मारा जा सकता है (जैसा and_orकि पुनरावर्ती रूप से परिभाषित किया गया है):

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

दोनों संचालकों में समान रूप से समानता है और उनका बाएं से दाएं मूल्यांकन किया जाता है (वे बाएं सहयोगी हैं)। डॉक्स कहते हैं:

एक AND-ORसूची ऑपरेटरों द्वारा अलग की गई एक या एक से अधिक पाइपलाइनों का अनुक्रम है "&&"और "||"

सूची में एक या अधिक का एक क्रम है और-या सूचियों ऑपरेटरों द्वारा अलग ';'और '&'और वैकल्पिक रूप से इन्हें समाप्त ';', '&', या।

ऑपरेटरों "&&"और "||"समान पूर्वता होगी और बाईं संगति के साथ मूल्यांकन किया जाएगा। उदाहरण के लिए, निम्नलिखित दोनों कमांड मानक आउटपुट के लिए पूरी तरह से बार लिखते हैं:

$ false && echo foo || echo bar
$ true || echo foo && echo bar
  1. पहले मामले में, झूठ एक कमांड है जो स्थिति की स्थिति से बाहर निकलता है 1

    $ false
    $ echo $?
    1
    

    जिसका अर्थ echo fooहै (यानी शार्टसर्किटिंग echo foo) नहीं चलता है । फिर कमांड echo barनिष्पादित किया जाता है।

  2. दूसरे मामले में, सच एक कोड के साथ बाहर निकलता है 0

    $ true
    $ echo $?
    0
    

    और इसलिए echo fooनिष्पादित नहीं किया जाता है, तब echo barनिष्पादित किया जाता है।


31

'&&' के लिए एक बहुत ही सामान्य उपयोग ऑटोटूलस के साथ सॉफ्टवेयर का संकलन है। उदाहरण के लिए:

./configure --prefix=/usr && make && sudo make install

मूल रूप से यदि कॉन्फ़िगर सफल होता है, तो मेक को संकलित करने के लिए चलाया जाता है, और यदि वह सफल होता है, तो प्रोग्राम को स्थापित करने के लिए रूट को रूट के रूप में चलाया जाता है। मैं इसका उपयोग तब करता हूं जब मैं ज्यादातर यह सुनिश्चित करता हूं कि चीजें काम करेंगी, और यह मुझे अन्य महत्वपूर्ण चीजें करने की अनुमति देता है जैसे कि स्टैकओवरफ्लो को देखो न कि प्रगति को मॉनिटर करना।

कभी-कभी मैं वास्तव में दूर हो जाता हूं ...

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf

मैं ऐसा तब करता हूं जब उदाहरण के लिए स्क्रैच बॉक्स से एक लिनक्स बनाना।


2
REPL में अच्छा है, लेकिन स्क्रिप्ट के लिए मैं set -o errexitबैश के लिए पसंद करूंगा ।
फ्रैंकलिन यू

19

&&तार एक साथ आदेश। यदि पूर्ववर्ती सफल होते हैं, तो क्रमिक आदेश केवल निष्पादित होते हैं।

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

बैश शैल प्रोग्रामिंग देखें ।


8

उदाहरण देखें:

mkdir test && echo "Something" > test/file

शेल निर्देशिका बनाने की कोशिश करेगा testऔर फिर, केवल अगर यह सफल था , तो इसके अंदर फ़ाइल बनाने का प्रयास करेगा।

यदि आप उनमें से एक में विफल रहे तो आप चरणों के अनुक्रम को बाधित कर सकते हैं।


8

यह एक दूसरे कथन को निष्पादित करने के लिए है यदि पहला बयान सफलतापूर्वक समाप्त हो जाता है। अगर एक बयान की तरह:

 if (1 == 1 && 2 == 2)
  echo "test;"

इसकी पहली कोशिश अगर 1 == 1 है, अगर यह सच है तो यह जांचता है अगर 2 == 2


1
क्या कोई समझा सकता है कि यह सवाल पर ठोकर खाने वाले उपयोगकर्ताओं के लिए क्यों अस्वीकृत किया गया था?
user3243242

1
@ user3243242 यह गलत नहीं है, सिर्फ एक खराब उदाहरण है&&
dan

यह ifपरीक्षण में कैसे काम में महान अंतर्दृष्टि है । मैंने इसकी तुलना कमांडों की श्रृंखला की तरह कभी नहीं की, जब उनमें से कोई भी विफल हो गया। तो आपको मेरा
उत्थान

1
परिणाम यह है कि आप ||चेन कमांड को प्रयोग करके विपरीत व्यवहार प्राप्त कर सकते हैं , जब तक उनमें से एक सफल नहीं होता: eei || leu || uie || echo prout3 || echo "never executed"
PiRK

7

command_1 && command_2: command_1 को तभी निष्पादित करें जब कमांड_1 को सफलतापूर्वक निष्पादित किया जाए।

command_1 || command_2: कमांड_2 को तभी निष्पादित करें जब कमांड 1 सफल निष्पादित न हो।

ऐसा लगता है कि कैसे एक 'अगर' स्थिति को मुख्यधारा की प्रोग्रामिंग भाषा में निष्पादित किया जाता है, जैसे, if (condition_1 && condition_2){...}हालत 2 में छोड़ दिया जाएगा , अगर हालत 1 है falseऔर if (condition_1 || condition_2){...}हालत 2 में छोड़ दिया जाएगा अगर हालत 1 है true। देखें, यह वही चाल है जिसका आप कोडिंग के लिए उपयोग करते हैं :)


मैं नहीं जानता कि आप 'बिल्कुल विपरीत' से क्या मतलब है, लेकिन $ 1 '1' प्रतिध्वनि || गूंज '2' केवल '1' प्रिंट करता है। और $ गलत_कम || इको '2' एक त्रुटि संदेश और अगली पंक्ति पर '2' प्रिंट करता है। क्या आप इसके बारे में थोड़ा और समझा सकते हैं कि आपको इसके बारे में क्या गलत लगता है?
Xiaonin Li

हो दोस्त, मैं निश्चित रूप से कल बहुत थक गया था। इसके लिए खेद है, यह केवल मैं ही था: / मुझे आपकी आवश्यकता है कि आपको उत्तर में कुछ संपादित करना है यदि आप चाहते हैं कि मैं अपवोट कर दूं (अपना उत्तर 0 बनाने के लिए, तो अब
स्टैकओवरफ़्लो

@ इसके बारे में, यह ठीक नहीं है। इसलिए मैंने अभी एक एडिट जमा किया है। तो क्या आप नीचे के वोट को हटाने में सक्षम हैं?
Xiaonin Li

हाँ, फिर से, क्षमा करें, वास्तव में
Arount

0
####################### && or (Logical AND) ######################
first_command="1"
two_command="2"

if [[ ($first_command == 1) && ($two_command == 2)]];then
 echo "Equal"
fi

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


Stackoverflow में आपका स्वागत है। कृपया सुनिश्चित करें कि यहां पोस्ट करने से पहले आपका कोड स्निपेट काम करता है। आपको इसे सही करना होगाif [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi
झेंग क्व

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