लिनक्स बैश सिंटैक्स: का अर्थ &&, \, और -


14

बैश कमांड के अंत में ' &&', ' \' और ' -' का क्या अर्थ है?

विशेष रूप से, मैं उन लाइनों के निम्नलिखित संयोजन में आया हूं जो उबंटू के एप्टीट्यूड पैकेज मैनेजर में सार्वजनिक कुंजी जोड़ने वाले हैं, उन पात्रों को यहां किस लिए उपयोग किया जाता है?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 और& \ _
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get update

"/" "\" जैसा नहीं है
थॉमस

थॉमस: अपने पद को तय किया
काइल ब्रांट

यहां बैकस्लैम की जरूरत नहीं है क्योंकि && भी निरंतर लाइन जारी रखने के लिए पर्याप्त होगा। बैकस्लैश का उपयोग करना, हालाँकि, पठनीयता में सहायक है।
अगली सूचना तक रोक दिया गया।

जवाबों:


37

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

किसी पंक्ति के अंत में "\" एक साथ लाइनों को जोड़ने का एक साधन है। तो निम्नलिखित दो लाइनें:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

ठीक उसी तरह संसाधित होते हैं जैसे कि लाइन को सिंगल लाइन के रूप में लिखा गया था:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

"-" एक कमांड लाइन तर्क है जिसमें कोई विशिष्ट बैश फ़ंक्शन नहीं है। वास्तव में इसे कैसे संभाला जाता है, इस पर चलाए जा रहे कमांड पर निर्भर करता है (इस मामले में उपयुक्त-कुंजी )। संदर्भ के आधार पर, इसका उपयोग आम तौर पर " फ़ाइल से डेटा को पढ़ने के बजाय स्टडिन से इंगित करने के लिए किया जाता है ", या " कमांड लाइन के तर्क के बजाय डेटा के रूप में शेष पंक्ति को संसाधित करें "।


5
इस स्थिति में, '-' sudo का पैरामीटर नहीं है, लेकिन 'apt-key' का, जिसका अर्थ है कि एक कुंजी फ़ाइल के बजाय, 'apt-key' पाइप के माध्यम से आने वाले डेटा ('|' ') का उपयोग अपने स्टड के लिए कर रहा है। एक कुंजी के रूप में। "Gpg --export" विकल्प, '--output a_file_name.key' के बिना, 'apt-key' के स्टड के लिए पाइप ('|') के माध्यम से, gpg स्टैडआउट से एक नई कुंजी को धकेलें। )
एडोमॉर

2
ओह। आधा सोते समय सवालों के जवाब के लिए मुझे यही मिलता है। तय की।
GoldPseudo

7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)

6

&& तार्किक है और:
&& तार्किक और व्यक्त करने का एक तरीका है , जिसका अर्थ है कि संपूर्ण अभिव्यक्ति केवल तभी सत्य है जब इसके दोनों पक्ष सत्य हैं। तर्क में, यह कहा जाता है कि संपूर्ण कथन (P & Q) केवल सत्य है जब P और Q दोनों सत्य हैं।

इसके परिणामस्वरूप, कंप्यूटर आमतौर पर पी एंड क्यू को शॉर्ट-सर्किट मूल्यांकन के रूप में मानते हैं । इसलिए चूंकि पूरा कथन केवल True होगा यदि P और Q दोनों सत्य हैं, तो यदि P गलत है, तो कथन Q का मूल्यांकन नहीं किया गया है । मूल रूप से कंप्यूटर आलसी (कुशल) होते हैं, और क्यू का मूल्यांकन करने में परेशान नहीं करते हैं यदि उनके पास भी नहीं है। यह तार्किक का भी सत्य है या, पिछला लिंक देखें।

बैश में && के तीन संदर्भ:

1) कमांड के एग्जिट स्टेटस के साथ शॉर्ट-सर्किट इवैल्यूएशन का उपयोग करना:
हर कमांड में एग्जिट स्टेटस होता है। यदि किसी कमांड में त्रुटि है, तो उसके पास एक निकास स्थिति है जो गैर-शून्य है। इसलिए यदि बाहर निकलने की स्थिति गैर-शून्य है और && का उपयोग एक आदेश में एक साथ चेन कमांड के लिए किया जाता है, तो बाद में आदेशों का मूल्यांकन (निष्पादित) नहीं किया जाएगा यदि पहले वाले के पास 0 (ट्रू) की निकास स्थिति नहीं थी। यह शॉर्ट-सर्किट मूल्यांकन के कारण है। इसलिए यदि आपके पास:

P && Q

यदि P सत्य नहीं था, तो Q निष्पादित नहीं किया जाएगा (यदि P किसी भी स्थिति से बाहर निकलता है लेकिन 0, यह सत्य नहीं है)। बस के रूप में ही:

./configure && make

यदि निष्पादन में कोई त्रुटि थी, तो इसे निष्पादित नहीं किया जाएगा, यह सच नहीं था। तो मूल रूप से, तब समाप्त होता है जब लेखन का एक तरीका हो तो

if ./configure ; then
   make
fi

ध्यान रखें तो अधिकांश संदर्भों में 0 गलत है, लेकिन तब नहीं जब यह एक निकास स्थिति की बात आती है।

2) && का उपयोग बाश में निर्मित [[]] परीक्षण कमांड में किया जा सकता है:

&& का उपयोग अंतर्निहित परीक्षण कमांड के अंदर bash [[]] में भी किया जा सकता है, इसी तरह अभिव्यक्ति को कमांड के संयोजन के रूप में जोड़ते हैं। संपूर्ण परीक्षण ऑपरेशन केवल तभी सत्य होगा जब && के दोनों ऑपरेंड (पक्ष) सही हों, उदाहरण के लिए:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

अगर $ a 2 और 5 के बीच पूर्णांक है (2 और 5 शामिल नहीं है) तो यह कहने का एक तरीका होगा।

3) अंकगणित मूल्यांकन:

अंत में, && का उपयोग अंकगणितीय मूल्यांकन में तार्किक और के रूप में किया जा सकता है। यदि निम्न में संख्याओं के दोनों (तार्किक और) गैर-शून्य हैं, तो यह 0 लौटाता है, 1 और दिया जाता है:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@ शैली: && एक तार्किक अभिव्यक्ति के बाहर प्रयोग किया जाता है "एंड कंट्रोल ऑपरेटर", समान व्यवहार लेकिन तकनीकी रूप से अलग
drAlberT

अपनी टिप्पणी का पालन न करें, तार्किक अभिव्यक्ति के बाहर आपका क्या मतलब है?
काइल ब्रांड्ट

मेरा मतलब है कि एक अभिव्यक्ति में && नियंत्रण ऑपरेटर "तार्किक और" का मतलब मानता है, अन्यथा यह केवल "और" है। यह "एंड कंट्रोल ऑपरेटर" है, जिसका उपयोग सूचियों में किया जाता है। तार्किक संचालकों का उपयोग अंकगणित के विस्तार, अभिव्यक्ति के संदर्भ में किया जाता है।
drAlberT

में if [./configure]उदाहरण के लिए, आप कोष्ठक निकाल देना चाहिए। सही हैif ./configure; then make...
जूलियानो

जूलियानो, अच्छी पकड़, अपडेट करेगा। अल्बर्ट, क्या मैन पेज देने वाले शब्दों के अलावा कोई अंतर है?
काइल ब्रान्ड

3

मुझे लगता है कि आप "वास्तविक" अर्थ की व्याख्या के साथ बेहतर होंगे, निहितार्थ एक और बात है :)

  • && "और" नियंत्रण ऑपरेटर है। से बैश आदमी :
    नियंत्रण ऑपरेटरों && और || क्रमशः सूची और सूची और सूची।
    एक और सूची में रूप है  
        कमांड 1 && कमांड 2     
    कमांड 2 को निष्पादित किया जाता है यदि, और केवल अगर, कमांड 1 शून्य से बाहर निकलने की स्थिति देता है।
    [..कट गया..]
    AND और OR सूचियों की वापसी स्थिति अंतिम कमांड की निकास स्थिति है
    सूची में निष्पादित।
    
    एक नियंत्रण ऑपरेटर है
    एक टोकन जो एक नियंत्रण कार्य करता है। यह निम्नलिखित प्रतीकों में से एक है:
        || &&; ;; () |
    
  • \" एस्केप कैरेक्टर " है, और यह बैश में उपलब्ध तीन उद्धरण तंत्रों में से एक है:
    का हवाला देते हुए
       कोटिंग का उपयोग शेल के कुछ वर्णों या शब्दों के विशेष अर्थ को निकालने के लिए किया जाता है।
    [..कट गया..]
       तीन उद्धरण तंत्र हैं: बच चरित्र, एकल उद्धरण, और दोहरे उद्धरण।
       एक गैर-उद्धृत बैकस्लैश (\) बच चरित्र है। यह अगले चरित्र के शाब्दिक मूल्य को संरक्षित करता है, जो इसके अपवाद के साथ है। यदि एक जोड़ी दिखाई देती है, और बैकस्लैश को स्वयं उद्धृत नहीं किया जाता है, तो \ _ को एक लाइन निरंतरता के रूप में माना जाता है (अर्थात, इसे इनपुट स्ट्रीम से हटा दिया जाता है और प्रभावी रूप से अनदेखा कर दिया जाता है)।
    [..कट गया..]
    बैकस्लैश अपने विशेष अर्थ को केवल तभी रखता है जब निम्न में से किसी एक अक्षर का अनुसरण किया जाता है: $, `,", \, या।
    
    इसका मतलब यह है कि यदि आप एक पंक्ति के बहुत अंत में एक भागने चरित्र ("\") डालते हैं, तो आप वास्तव में नई लाइन चार से बच रहे हैं जो तुरंत इसका अनुसरण करता है (RETURN char) इस प्रकार "लाइन जारी रखें" का प्रभाव पड़ता है दूसरों ने पहले ही अपने उत्तर में समझाया है
  • डैश चार " - " कि कुछ कमांड पैरामीटर के रूप में स्वीकार करते हैं, एक सम्मेलन है, शेल विशेष चार या ऑपरेटर नहीं। जैसा कि अन्य पहले से ही बताया गया है, यह मानक I / O धाराओं के लिए जगह-मार्कर का एक प्रकार है। हम जिस प्रोग्राम को संदर्भित करते हैं उसके आधार पर यह स्टडिन (मानक इनपुट) या स्टडआउट (मानक आउटपुट) के लिए रह सकता है।

मेरे 2 सेंट


1
शायद tl का मामला होने जा रहा है, डॉ। एक मैनपेज के विशालकाय विखंडन - जैसा कि ज्ञानवर्धक है - संभवतः ओपी को भयभीत कर देगा।
छड़ीजेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.