जो बैश लिपि में अधिक मुहावरेदार है: `|| सच` या `|| : `?


36

मैं बहुत अधिक शेल स्क्रिप्टिंग नहीं करता, इसलिए जब मैं इसके लिए प्रलेखनgit submodule पढ़ रहा था तो मैं थोड़ा हैरान था और मैंने इस दस्तावेज़ में उनके द्वारा उपयोग किए गए वाक्यविन्यास को देखा:

किसी भी सबमॉडल में कमांड से गैर-शून्य रिटर्न प्रोसेसिंग को समाप्त करने का कारण बनता है। || :कमांड के अंत में जोड़कर इसे ओवरराइड किया जा सकता है ।

मुझे यह देखना था कि || :एक कमांड को सफलतापूर्वक बाहर निकलने के लिए मजबूर करना एक शॉर्टहैंड था। कभी भी, मुझे एक कमांड एग्जिट सक्सेसफुल बनाना है, मैंने इस्तेमाल किया || true। क्या || :अधिक मुहावरेदार माना जाता है?


यह ध्यान देने योग्य है कि ||:(बिना स्थान के) भी बाश में मान्य है। यह वही काम करता है जो || :या || true
ब्रूनो ब्रोंस्की

जवाबों:


38

trueबॉर्न शेल में नहीं बनाया गया था। :हमेशा था (यह #शुरू करने से पहले टिप्पणी दर्ज करने का तरीका था)।

यह, और क्योंकि यह टाइप करने के लिए छोटा है, शायद लोगों द्वारा पसंद किए :जाने का मुख्य कारण है true

POSIX गोले में एक और अंतर नोट करें ( bashकेवल POSIX मोड में): जबकि trueएक नियमित रूप से बिलिन है (बिल्ट भी नहीं है), :एक विशेष बिलिन है। इसके कुछ निहितार्थ हैं, जिनमें से अधिकांश के इस विशेष मामले में कोई प्रभाव होने की संभावना नहीं है:

  • यदि कोई :आदेश विफल हो जाता है, जिसमें एक असफल पुनर्निर्देशन शामिल है, जो शेल से बाहर निकलने का कारण बनता है। व्यवहार में, जब तक आप पुनर्निर्देशन पास नहीं करते हैं, तब तक शायद इससे कोई फर्क नहीं पड़ेगा:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
    
  • में var=value :, रिटर्न के बाद varसेट किया valueगया :है, के मामले में नहीं true:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1
    

यह भी ध्यान रखें कि || trueके गोले में काम करता है rcऔर cshपरिवारों लेकिन नहीं || :(लेकिन रद्द करने के लिए नहीं set -eमें csh)।

|| :के रूप में ही नहीं है :। इसका अर्थ है या :अन्यथा अन्यथा (यदि पूर्ववर्ती पाइपलाइन विफल हो जाए)।

set -e
false

शेल को बाहर निकलने का कारण होगा set -eऔर falseगैर-शून्य (विफलता) निकास स्थिति है। set -eप्रभाव से रद्द कर दिया गया है, तो आदेश है कि रिटर्न एक गैर शून्य से बाहर निकलें स्थिति एक के रूप में प्रयोग किया जाता है हालत में की तरह:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :केवल कैंसिल set -efalse || :रद्द करने set -eऔर बाहर निकलने की स्थिति सेट करने के 0लिए यह कहना अधिक मुहावरेदार है कि हम कमांड के विफलता निकास कोड को अनदेखा करना चाहते हैं। अधिकांश का तर्क होगा कि || trueअधिक सुपाठ्य है (इरादे को और अधिक स्पष्ट रूप से बताता है)।


5
&& :शानदार है, क्या इस पर कोई डॉक्स या आगे पढ़ना है? Google इस तरह के कीवर्ड खोजने की कोशिश में मुझ पर कम पड़ता है ...
इयान बायटेक

5

आम तौर पर, बाश में, बृहदान्त्र :और trueसमकक्ष होता है।

है || : अधिक मुहावरेदार माना जाता है?

मुझे लगता है कि यह संदर्भ पर आधारित है

यदि आप चाहते हैं return value, या conditionयह हमेशा सच है, तो आपको trueकीवर्ड का उपयोग करना चाहिए , यह आपके कोड को और अधिक स्पष्ट रूप से बना देगा और दर्शकों को बताएगा कि आप चाहते हैं कि मूल्य सही है , अर्थात:

while true; do something

या

<commnad>
RETURN_VALUE= $? || true

और अगर आप कुछ नहीं करना चाहते हैं , या NOPशेल में, आपको कोलन का उपयोग करना चाहिए:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

या

while conditon
do
    : # DO NOTHING HERE
done

5

इनमें से अधिकांश प्रतिक्रियाएं सबसे आम उपयोग को संबोधित करने में विफल रहती हैं :

सबसे पहले, यह चर्चा किसी भी शेल से संबंधित नहीं है जो बॉर्न शेल ( sh) व्युत्पन्न नहीं है। उस ने कहा, सभी बॉर्न व्युत्पन्न गोले देखते हैं trueऔर :एक ही चीज के रूप में। प्रोग्रामर्स को :इसके बजाय उपयोग करने के लिए प्रोत्साहित किया जाता था true, क्योंकि :हमेशा एक अंतर्निर्मित होता है, जबकि ऐसे मामले हुआ करते trueथे जो हमेशा एक अंतर्निर्मित नहीं होते थे।

:दो उपयोग हैं। यह एक पर्यायवाची नहीं है #, लेकिन इसका एक अलग कार्य है। अपनी स्क्रिप्ट को ए के नीचे डिबग करते समय set -x, जहां लाइनों #का उपयोग किया जाता है उसे पार्सर द्वारा हटा दिया जाता है और पूरी तरह से अनदेखा कर दिया जाता है, जबकि लाइनों के साथ :पार्स और मूल्यांकन किया जाता है। यह वास्तव में डिबगिंग में उपयोगी है क्योंकि -xउन लाइनों के नीचे दिखाया गया है और मूल्यांकन के बाद उनका मूल्य प्रदर्शित किया जाता है। यह printआपके कोड में स्टेटमेंट डालने जैसा है जो केवल -xमोड के तहत दिखाता है। मूल्यों के साथ सावधान रहें :क्योंकि वे वास्तविक कोड हैं और दुष्प्रभाव आपके प्रोग्राम को प्रभावित कर सकते हैं।


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