"-बैश:!": ईवेंट नहीं मिला "


114

निम्नलिखित को बैश शेल के तहत निष्पादित करने का प्रयास करें echo "Reboot your instance!"

मेरी स्थापना पर:

root@domU-12-31-39-04-11-83:/usr/local/bin# bash --version
GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@domU-12-31-39-04-11-83:/usr/local/bin# uname -a
Linux domU-12-31-39-04-11-83 2.6.35-22-virtual #35-Ubuntu SMP Sat Oct 16 23:57:40 UTC 2010 i686 GNU/Linux
root@domU-12-31-39-04-11-83:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found

किसी को भी समझा सकते हैं कि क्या है "बैश घटनाओं?" मैंने इस अवधारणा को पहले कभी नहीं सुना है। इसके अलावा, मुझे कैसे आउटपुट करना चाहिए "!" वाक्य के अंत में?

जवाबों:


53

आप इतिहास प्रतिस्थापन का उपयोग बंद कर सकते हैं set +H


2
क्या आप वाक्य रचना के पीछे तर्क को जानते हैं? ऐसा लगता है कि वास्तव में काउंटर इंट्रूवेटिव है। आपको लगता है कि आप +Hकुछ को सक्षम -Hकरने और कुछ को अक्षम करने के लिए चाहेंगे ।
गेविन वार्ड

7
@PunkyGuy: मुझे इसके पीछे का इतिहास (अभीष्ट) ज्ञात नहीं है, लेकिन यूनिक्स विकल्प आमतौर पर एक हाइफ़न (या माइनस) से शुरू होते हैं और +बस इसके विपरीत होते हैं।
डेनिस विलियमसन

105

!बैश करने के लिए एक विशेष चरित्र है, यह पिछले आदेशों को संदर्भित करने के लिए उपयोग किया जाता है; जैसे,

!rm

स्ट्रिंग "आरएम" के साथ शुरू हुई अंतिम कमांड को याद करेगा और निष्पादित करेगा, और

!rm:p

याद करेंगे लेकिन अंतिम कमांड को निष्पादित नहीं करेंगे जो स्ट्रिंग "आरएम" के साथ शुरू हुआ था। बैश, विस्मयादिबोधक चिह्न echo "reboot your instance!"को " विकल्प के रूप में अंतिम कमांड जो चरित्र के साथ शुरू हुआ था उसे यहां व्याख्यायित करता है" जो कि तुरंत विस्मयादिबोधक चिह्न का अनुसरण करता है ", और आप पर मुस्कराता है कि यह आपके इतिहास में एक घटना (कमांड) नहीं ढूंढ सकता है जो एक एकल के साथ शुरू हुआ हो दोहरे उद्धरण।

प्रयत्न, कोशिश

echo reboot your instance\!

बश से विस्मयादिबोधक चिह्न (बचाना)।


हां, लेकिन अगर मुझे इको-ई का उपयोग करना है तो "कुछ टेक्स्ट $ ENV_VAL कुछ और टेक्स्ट \ nebeboot का उपयोग करना चाहिए!" ?
मैक्सिम वीक्स्लर

1
दो गूंज कथन लिखें; आपको मुफ्त में लाइनफीड मिलती है।
मद्रहेट

1
सरल समाधान एक बार में एकल उद्धरण और दोहरे उद्धरण चिह्नों का उपयोग करना है: इको-"टेक्स्ट \ nReeboot"! ''
4

4
यह बेकार है। यदि मैं विस्मयादिबोधक चिह्न से बच नहीं जाता है, तो बैश एक फिट फेंकता है। अगर मैं कर यह बच, बैकस्लैश अंतिम स्ट्रिंग में शामिल है। तुम ऐसा क्यों करते हो, बैश !! ( pastebin.com/g4PYv56A )
हब्रो

2
@ निष्पक्षता में, मुझे यकीन नहीं है कि सभी बैश की गलती है। माणिक को चीजों को काटने के लिए खिलाने के लिए आपके पास कुछ जटिल मामले हैं, और यह मेरे लिए स्पष्ट नहीं है कि भागने के पात्रों के स्ट्रिपिंग या सुदृढ़ीकरण में कौन सा हिस्सा रूबी खेल रहा है।
MadHatter

25

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

!कमांड लाइन के इतिहास को संदर्भित करने के लिए कमांड में उपयोग किया जाता है। देखें: http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS एक पूर्ण सेट के लिए। उपरोक्त उदाहरण के साथ, बैश !"एक घटना के संदर्भ के रूप में विस्तार करने की कोशिश कर रहा है इससे पहले कि गूंज में एक नज़र मिल जाए, इसलिए त्रुटि।

ध्यान दें कि लिपियों में, सभी इतिहास कमांड अक्षम हैं, क्योंकि वे केवल एक इंटरैक्टिव शेल में समझ में आते हैं।

केवल एक जो मैं नियमित रूप से उपयोग करता हूं, वह है !$। यह पिछले कमांड के अंतिम तर्क तक फैलता है। यह स्थानों में एक उपयोगी आशुलिपि है।


4
!!पूर्ण अंतिम कमांड भरने के लिए उल्लेखनीय रूप से उपयोगी है; विशेष रूप से, sudo !!याpfexec !!
jgoldschrafe

2
मैं सूदो और pfexec को अच्छी उपयोगिताओं के रूप में भी पाता हूं, लेकिन इतना उत्साही होने की कोई आवश्यकता नहीं है।
लेर्ट्स

$_बैश से अधिक गोले में काम करता है और इसके विपरीत यह एक उचित चर है !$। (और @LeartS: मैं इमोटिकॉन के मजाक की कमी पसंद आया;।))
ΤΖΩΤΖΙΟΥ

7

बस बीच में एक जगह रखो! और "से यह काम करेगा।

चीयर्स।


2
क्या आप इस बारे में स्पष्टीकरण जोड़ सकते हैं कि आपका समाधान क्यों काम करता है?
200_सेफ़

2
यह काम करता है क्योंकि बैश केवल व्यवहार करता है! एक विशेष चरित्र के रूप में अगर यह सीधे एक गैर-व्हाट्सएप चरित्र द्वारा पीछा किया जाता है। हालांकि, यह आपके आउटपुट में एक अतिरिक्त रिक्त भी जोड़ देगा, ताकि हमेशा वांछित न हो ...
mmey

2

हाँ, ! को काटने के लिए एक विशेष चरित्र है, इसका उपयोग पिछले आदेशों को संदर्भित करने के लिए किया जाता है।

कुछ तरीकों से आप स्थिति को संभाल सकते हैं

निम्नलिखित स्ट्रिंग को आउटपुट करेगा जैसा कि यह है

echo 'Reboot your instance!'

निम्नलिखित कमांड को निष्पादित करेगा और स्ट्रिंग को संक्षिप्त करेगा

echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`

1

में bash 4.3ऐसा लगता है तुम अब एकल उद्धरण या उपयोग करने की आवश्यकता set +H:

$ bash --version
GNU bash, version 4.3.46(1)-release (x86_64-unknown-linux-gnu)
[...]
$ echo "Reboot your instance!"
Reboot your instance!

शायद एक बग, क्योंकि यहां, मेरे पास 4.4.12 हैं और अभी तक फिर से, मुझे ज़रूरत है set +Hया उद्धृत कर रहा हूं । या आपके पास set +Hकहीं (जैसे /etc/profile) है।
बोडो थिसेन

वाक्य के अंत में नहीं -char का उपयोग करना बैश की घटना का पता लगाने के लिए पुष्टि करता है कि वह अभी भी ठीक काम कर रहा है। संस्करण ४.३.३० ........ $ इको "अपने वाक्य को रीचेक करें! फ़ू" बैश:! फू: ईवेंट नहीं मिला
जॉनीडॉ

0

आप एक हेरेडोक का उपयोग भी कर सकते हैं :

cat <<EOF
Reboot your instance!
EOF

यह इस मामले में कष्टप्रद है क्योंकि यह एक-लाइनर नहीं है, लेकिन लंबे आदेशों के लिए (जैसे बैश स्क्रिप्ट लिखना), यह बहुत अच्छा काम करता है।

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