बैश में एक एकल विस्मयादिबोधक चिह्न टाइप करना क्या है?


20

बैश इतिहास के विस्तार के लिए विस्मयादिबोधक चिह्नों का उपयोग करता है, जैसा कि इस प्रश्न के उत्तर में समझाया गया है (उदाहरण sudo !!के साथ पिछली कमांड-लाइन चलाता है sudo)। हालाँकि, मैं कहीं भी यह नहीं बता सकता कि निम्नलिखित कमांड को चलाने का मतलब क्या है (यानी एक एकल विस्मयादिबोधक चिह्न):

!

यह कुछ भी नहीं छापता है और 1 के साथ बाहर निकलता है, लेकिन मुझे यकीन नहीं है कि यह ऐसा क्यों करता है। मैंने ऑनलाइन और बैश मैन पेज में देखा है, लेकिन इस तथ्य से अलग कुछ भी नहीं मिल रहा है कि यह "आरक्षित शब्द" है - लेकिन ऐसा है }, और यह चल रहा है:

}

एक त्रुटि प्रिंट:

bash: syntax error near unexpected token `}'

1
कुछ भी तो नहीं। !एक इतिहास विस्तार अभिव्यक्ति की "शुरुआत" इंगित करता है।
जोर्डनम

जवाबों:


47

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

यह उपयोग बैश मैनुअल में प्रलेखित है:

अगर आरक्षित शब्द '!' पाइपलाइन से पहले, बाहर निकलने की स्थिति ऊपर बताए अनुसार बाहर निकलने की स्थिति का तार्किक निषेध है।

एक !कोई निम्न आदेश के साथ खाली आदेश है, जो कुछ भी नहीं है और सच रिटर्न (के बराबर करता है नकारता आदेश )। इस प्रकार यह असत्य का सही अर्थ निकालता है और स्थिति 1 से बाहर निकलता है, लेकिन कोई त्रुटि उत्पन्न नहीं करता है।:


वहाँ भी के अन्य उपयोगों हैं !भीतर testऔर [[आदेशों, जहां वे एक सशर्त परीक्षण नकारना। ये आप जो देख रहे हैं उससे असंबंधित हैं। आपके प्रश्न और उन दोनों मामलों में, यह इतिहास विस्तार से संबंधित नहीं है और इसे !किसी भी अन्य शब्दों से अलग किया गया है।


5
+1 पहले उत्तर के लिए कि वास्तव में क्या चलाया जाता है और क्यों यह रिटर्न कोड की व्याख्या करता है।
जेफ स्कालर

11

आप bash मैनुअल सेक्शन 3.2.2 पाइपलाइनों में प्रलेखित एकल विस्मयादिबोधक बिंदु पा सकते हैं

अगर आरक्षित शब्द '!' पाइपलाइन से पहले, बाहर निकलने की स्थिति ऊपर बताए अनुसार बाहर निकलने की स्थिति का तार्किक निषेध है।

$ ! true; echo $?
1
$ ! false; echo $?
0

साथ ही खंड 3.2.4.2 सशर्त निर्माण

! अभिव्यक्ति

सच है अगर अभिव्यक्ति झूठी है।


इसके अलावा खंड 4.1 बॉर्न शेल बिल्डिंग्स

! expr

सच है अगर एक्सप्रे झूठे हैं।


यह भी ध्यान दिया जाना चाहिए कि !इतिहास प्रतिस्थापन शुरू हो जाएगा जब तक कि इसके बाद: एक स्थान, टैब, पंक्ति का अंत, '=' या '(' (जब एक्सग्लोब शेल विकल्प को शॉप बिल्ड का उपयोग करके सक्षम किया जाता है)।


0

क्योंकि !तुलना और साधन में प्रयोग नहीं किया जाता है ।

उदाहरण के लिए:

a=3
b=2

[ $a -eq $b ] && echo "Equal"
[ ! $a -eq $b ] && echo "Not equal"
# of cause last comparison is possible to write as:
[ $a -eq $b ] || echo "Not equal"

[ $a -eq $b ]
echo $?
1
[ ! $a -eq $b ]
echo $?
0

1
कमांड के !तर्क के रूप में इसका अर्थ है test(बैश के अंतर्निहित संस्करण सहित), !कमांड की स्थिति में उपयोग किए जाने पर इसका अर्थ नहीं ।
गिल्स एसओ- बुराई को रोकना '

1
! [...]इस मामले में प्रश्न का मिलान करने की आवश्यकता होगी ।
माइकल होमर

@ गिले और @ मिकेल होमर के साथ सहमत। मुझे पता था कि []है test। मैं जल्दबाजी कर रहा हूँ।
Yurij Goncharuk

-2

! अंतर्निहित कमांड, एक पाइप लाइन की भावना को निष्क्रिय करता है।

अन्य उपयोग:

#! अंतर्निहित कमांड, स्क्रिप्ट को निष्पादित करने के लिए नामित दुभाषिया को आमंत्रित करता है।

! ईवेंट डिज़ाइनर, इतिहास प्रतिस्थापन के रूप में एक कमांड-लाइन शब्द चिह्नित करता है

!= असमानता संचालक

$! शेल वैरिएबल, अंतिम पृष्ठभूमि कमांड की प्रक्रिया संख्या देता है।


बस जोड़ने के लिए, एक का उपयोग कर सकते हैं! $ पिछले कमांड के अंतिम शब्द का उपयोग करने के लिए इस तरह: ls -l /tmp cd !$ यह आपको / tmp निर्देशिका में ले जाएगा।
बनी

-3

! एक स्ट्रिंग के बाद सबसे हाल के पिछले कमांड (अभी भी कमांड बफर में) को निष्पादित करता है जो कि दिए गए स्ट्रिंग के साथ शुरू हुआ था। हो सकता है कि शेल ने यह पाया हो कि कोई भी पिछला कमांड <n> से शुरू नहीं हुआ है।


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