क्या 'और' और ';' के बीच अंतर है एक मानक BASH टर्मिनल में प्रतीक?


56

वे दोनों संकेत BASH को प्रतीकों के बाद एक और कमांड के साथ शुरू करते हैं, लेकिन क्या एक अलग अंतर है?

जवाबों:


75

इस लाइन के साथ:

command1 && command2

कमांड 2 को निष्पादित किया जाएगा यदि (और केवल यदि) कमांड 1 निकास स्थिति शून्य को लौटाता है, जबकि इस पंक्ति में:

command1 ; command2

दोनों कमांड 1 और कमांड 2 को परवाह किए बिना निष्पादित किया जाएगा। अर्धविराम आपको एक पंक्ति में कई कमांड टाइप करने की अनुमति देता है।


1
दिलचस्प! मैंने सोचा था कि यह एक अधिक आरामदायक तरीका हो सकता है। धन्यवाद!

42

आप अपने लिए अंतर आजमा सकते हैं:

  1. ls /invalid/path && echo "hello!"
    चूंकि / अमान्य / पथ मौजूद नहीं है, इसलिए ls आपको निर्देशिका लिस्टिंग नहीं दिखा सकता है। यह एक त्रुटि संदेश के साथ विफल हो जाएगा: "ls: / अमान्य / पथ: ऐसी कोई फ़ाइल या निर्देशिका नहीं"। कमांड
    की दूसरी छमाही (गूंज "हैलो!") को कभी भी निष्पादित नहीं किया जाता है, क्योंकि पहली छमाही विफल रही।

  2. ls /invalid/path ; echo "hello!"
    वही त्रुटि संदेश पहले की तरह दिखाई देता है, लेकिन इस बार, दूसरा भाग निष्पादित किया गया है !
    ls: / अमान्य / पथ: ऐसी कोई फ़ाइल या निर्देशिका नहीं है
    !

यह क्यों उपयोगी है?
मान लीजिए कि आप आर्काइव.टार्ग.जी नामक एक फाइल निकालना चाहते हैं, तो
आप कमांड का उपयोग कर सकते हैं tar zxvf archive.tar.gz && rm archive.tar.gz
यदि किसी कारण से पुरालेख का निष्कर्षण विफल हो जाता है, तो दूसरा भाग निष्पादित नहीं होता है! आप फिर से कोशिश कर सकते हैं

यदि तुम प्रयोग करते हो ; उसी स्थिति में, संग्रह हटा दिया जाता है और आप फिर से कोशिश नहीं कर सकते।


8

&&इसका ANDअर्थ यह है कि दूसरा कमांड केवल तभी निष्पादित होगा जब पहले वाला सच लौटा हो (कोई त्रुटि नहीं)।


1
&& एक "तब" है (एक "और" नहीं) ... मेरा जवाब देखें
पीटर

2
@ यदि मैंने कहा कि यह "और" शॉर्ट-सर्किट मूल्यांकन के साथ है - यदि पहला भाग गैर-सत्य है, तो यह पता है कि कुल परिणाम गलत होना चाहिए, इसलिए यह दूसरा भाग छोड़ देता है। लेकिन इस बात को स्वीकार करें कि इसे "तब" के रूप में सोचने से शायद ही कभी इस संदर्भ में ज्यादा फर्क पड़ता है।
jg-faustus

2
@fred हालांकि वैचारिक रूप से इसे इस तरह समझना आसान हो सकता है, मैं आपके कथन से असहमत हूं। विचार बस यह है कि किसी भी AND निष्पादन के साथ 2 पैरामीटर अप्रासंगिक हो जाता है यदि पहला एक समान होता है falseऔर इसलिए अंतर्निहित कोड 2 पैरामीटर के स्थगित मूल्यांकन के लिए अनुकूलित हो जाता है जब तक कि यह नहीं जानता कि पहला क्या है।
वार्ड मुइलार्ट

2
@ यदि मुझे यकीन नहीं है कि वह उदाहरण किस बिंदु पर बनाने की कोशिश कर रहा है। &&बस एक बाइनरी ऑपरेटर है, एक फ़ंक्शन। केवल "विशेष" बात यह है कि यह infix संकेतन है (जो कि इस तरह के अधिकांश ऑपरेटरों के लिए वैसे भी मानक है) और दूसरे ऑपरेंड के निष्पादन में देरी हुई। उस विलम्बित निष्पादन से वास्तव में इसे ऐसी चीज़ के रूप में उपयोग करने की क्षमता मिलती है जिसे वैचारिक रूप से इस संदर्भ में एक ifबयान के रूप में देखा जा सकता है , लेकिन यह इस तथ्य से दूर नहीं है कि यह मूल रूप से उपयोग किया गया उद्देश्य वास्तविक विवरण की शर्त के भीतर है if। यहाँ उपयोग वास्तव में एक "हैक" का अधिक है।
वार्ड मुइलअर्ट

3
@ निश्चित रूप से यह एक सहायक ऑपरेटर नहीं है, यह सिर्फ दो ऑपरेशनों का उत्तराधिकार है a && b || c = (a && b) || c। मूल्यांकन का सरल क्रम। वहाँ वास्तव में कोई रहस्य नहीं है। यदि आप उन्हें अपने विशिष्ट कार्यों की तरह लिखते हैं, तो यह बस की तरह दिखेगा or(and(a, b), c)। यह तर्क एक के भीतर एक ही है ifक्योंकि जब यह सीधे कमांड लाइन में प्रवेश करने के साथ ही सशर्त &&और ||कर रहे हैं ऑपरेटरों , वे दो ऑपरेंड लेने के लिए और वे एक और लौट आते हैं।
वार्ड मुइलेर्ट

8

अपडेट : मैंने कुछ संभावित ट्रैप को हाईलाइट करने के लिए स्क्रिप्ट के रूप में जोड़ा है:

क्योंकि किसी और ने "" "" का उल्लेख नहीं किया है, मैं करूँगा

Update2 : कुछ महत्वपूर्ण री-वर्डिंग यहाँ
&& एक "अगर" स्टेटमेंट की तरह है, तो "सच" का जवाब

|| है नहीं एक "अगर" बयान .. की "और" की तरह
|| "अगर" कथन का "तब" जैसा है जो "असत्य" का जवाब देता है

अधिक विशिष्ट, && $ का परीक्षण करता है? पिछले सबसे हाल ही में निष्पादित किए गए बयान का रिटर्न मान और && के तुरंत बाद स्टेटमेंट या सब-शेल पर नियंत्रण पास कर देता है ... यह केवल नियंत्रण पास करता है यदि $? सच हैं।

|| समान है, और अक्सर एक && कथन का अनुसरण करते हुए देखा जाता है, लेकिन यह पिछले सबसे हाल ही में निष्पादित बयान से एक झूठी वापसी मूल्य ($!) के लिए परीक्षण करता है ... एनबी! , नोट बेने! अच्छी तरह से नोट करें! .... यदि पूर्ववर्ती कथन एक && कथन है, जो आपके सत्य होने की अपेक्षा के बाद गलत साबित होता है, तो || झूठ का जवाब देंगे, इसलिए दोनों को एक ही पंक्ति में मिलाना जोखिम भरा हो सकता है

मैं जो मुख्य बिंदु बनाने की कोशिश कर रहा हूं वह एक गलती के संबंध में है जो मैंने किया है। अर्थात:
## [[स्थिति]] और& ए || B
, C / C ++ स्टाइल टर्नरी की तरह व्यवहार नहीं करता है। अर्थात:
// (शर्त)? A: B
"A" से "अप्रत्याशित" परिणामों के उदाहरणों के लिए नीचे दी गई स्क्रिप्ट देखें

मूल परीक्षण और && और || कथन सभी को एक ही पंक्ति में होना चाहिए ...


इस स्क्रिप्ट को यह देखने के लिए चलाएं कि & && का उपयोग करते समय कौन सी चीजें गलत हो सकती हैं? सबसे हाल ही में मार डाला बयान एक जैसा कि आप उम्मीद नहीं हो सकता है ..

[[हालत]] && गूंज हैलो || गूंज अलविदा .... आम तौर पर सुरक्षित है,
एक अच्छी तरह से गठित गूंज सच वापस आ जाएगी।
लेकिन क्या एक फ़ाइल तक पहुँचने के बारे में जो बाहर नहीं निकलता है?

#!/bin/bash
#
# "as expected" return codes" means: expected to behave like a normal AND / OR  contition test
#
if [[ "$1" != "" ]] ; then exit $1; fi # recursive call to return an arbitary $? value (decimal)
echo
echo 'test 1: All return codes are "as expected"'
echo  ======
 ((1==1)) && echo  " ((1==1)) rc=$? ..&&.. condition is true" || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && echo "  \$0  0   rc=$? ..&&.. condition is true" || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && echo  " ((1!=1)) rc=$? ..&&.. condition is true" || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && echo "  \$0  1   rc=$? ..&&.. condition is true" || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 2: Now throw in some "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"
echo
echo 'test 3: Now swap the order of && and || statements, using "as expected" return codes'
echo  ======
 ((1==1)) || echo  " ((1==1)) rc=$? ..||.. condition is true" && echo  " ((1==1)) rc=$? ..&&.. condition is false"
  $0  0   || echo "  \$0  0   rc=$? ..||.. condition is true" && echo "  \$0  0   rc=$? ..&&.. condition is false"
 ((1!=1)) || echo  " ((1!=1)) rc=$? ..||.. condition is true" && echo  " ((1!=1)) rc=$? ..&&.. condition is false"
  $0  1   || echo "  \$0  1   rc=$? ..||.. condition is true" && echo "  \$0  1   rc=$? ..&&.. condition is false"
echo
echo 'test 4: With the order of && and || statements still swapped, introduce "unexpected" errors into the first of the &&/|| pair' 
echo  ======
 ((1==1)) && (echo  " ((1==1)) rc=$? ..&&.. condition is true"; $0 1)  || echo  " ((1==1)) rc=$? ..||.. condition is false"
  $0  0   && (echo "  \$0  0   rc=$? ..&&.. condition is true"; $0 2)  || echo "  \$0  0   rc=$? ..||.. condition is false"
 ((1!=1)) && (echo  " ((1!=1)) rc=$? ..&&.. condition is true"; $0 3)  || echo  " ((1!=1)) rc=$? ..||.. condition is false"
  $0  1   && (echo "  \$0  1   rc=$? ..&&.. condition is true"; $0 4)  || echo "  \$0  1   rc=$? ..||.. condition is false"

exit 



0

कमांड (फ़ंक्शन, स्क्रिप्ट के मामले में) के बाद &&पहले कमांड के रिटेल (स्क्रिप्ट के मामले में फ़ंक्शन ) के आधार पर निष्पादित किया जाता है। यह पहली कमांड को 0 के मान को वापस करने के लिए मजबूर करता है, यदि सफल हो। हम आगे आदेशों को निष्पादित करने के लिए वापसी मूल्य की जांच कर सकते हैं।

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