सवाल "-बैश:!" क्या है: घटना नहीं मिली "


एक बैश खोल के तहत निम्नलिखित निष्पादित करने का प्रयास करें 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

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


88
2017-12-02 10:45


मूल




जवाब:


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


40
2017-12-02 16:31



क्या आप वाक्यविन्यास के पीछे तर्क जानते हैं? यह वास्तव में नकल intuitative लगता है। आपको लगता है कि आप टाइप करेंगे +H कुछ सक्षम करने के लिए और -H कुछ अक्षम करने के लिए। - PunkyGuy
@PunkyGuy: मुझे इसके पीछे इतिहास (पन इरादा) नहीं पता है, लेकिन यूनिक्स विकल्प आम तौर पर एक हाइफ़न (या शून्य) से शुरू होते हैं और + बस इसके विपरीत है। - Dennis Williamson


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

!rm

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

!rm:p

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

प्रयत्न

echo reboot your instance\!

बाश से विस्मयादिबोधक चिह्न की रक्षा (भागने) के लिए।


86
2017-12-02 10:49



हां, लेकिन अगर मैं echo -e का उपयोग करना चाहता हूं तो कुछ होना चाहिए "कुछ पाठ $ ENV_VAL कुछ और पाठ \ n अभी रीबूट करें!" ? - Maxim Veksler
दो गूंज बयान लिखें; आप मुफ्त में लाइनफीड प्राप्त करते हैं। - MadHatter
सरल समाधान एक ही उद्धरण और डबल कोट्स का उपयोग एक बार में करना है: echo -e "टेक्स्ट \ n रीबूट" '! - mmey
यह बेकार है। अगर मैं विस्मयादिबोधक चिह्न से बच नहीं पाता हूं, तो बाश फिट हो जाती है। अगर मैं करना इसे से बचें, बैकस्लैश अंतिम स्ट्रिंग में शामिल है। तुम ऐसा क्यों करते हो, बैश !! (pastebin.com/g4PYv56A) - Hubro
@ हूबरो निष्पक्षता में, मुझे यकीन नहीं है कि सभी बाश की गलती है। चीजों को खिलाने के लिए रूबी का उपयोग करके आपके पास कुछ जटिल मामले हैं, और यह मुझे स्पष्ट नहीं है कि भागने वाले पात्रों को अलग करने या मजबूती में कौन सा हिस्सा रूबी खेल रहा है। - MadHatter


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

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

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

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


22
2017-12-02 11:02



!! दर्ज अंतिम अंतिम आदेश भरने के लिए उल्लेखनीय रूप से उपयोगी है; विशेष रूप से, sudo !! या pfexec !! - jgoldschrafe
मुझे अच्छी उपयोगिता होने के लिए सुडो और पेफेक्स भी मिलते हैं, लेकिन इतने उत्साही होने की आवश्यकता नहीं है। - LeartS
$_ बैश की तुलना में अधिक गोले में काम करता है और यह एक उचित चर है, विपरीत !$। (और @LeartS: मुझे आपके मजाक की इमोटिकॉन्स की कमी पसंद आई।)) - ΤΖΩΤΖΙΟΥ


बस एक जगह रखो! और "इससे काम करेगा।

चीयर्स।


5
2017-09-25 07:06



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


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

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

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

echo 'Reboot your instance!'

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

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

2
2018-04-25 13:57





में 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!

1
2017-07-12 14:43



शायद एक बग, क्योंकि यहां, मेरे पास 4.4.12 है और फिर भी, मुझे चाहिए set +H या उद्धरण। या आपके पास है set +H कहीं (जैसे अंदर /etc/profile)। - Bodo Thiesen
का उपयोग करना! -Char वाक्य के अंत में नहीं है बैश की घटना का पता लगाने की पुष्टि अभी भी ठीक काम कर रही है। संस्करण 4.3.30 ........ $ गूंजें "अपनी सजा दोबारा जांचें! Foo" bash:! Foo: घटना नहीं मिली - JohnnyD92


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

cat <<EOF
Reboot your instance!
EOF

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


0
2017-07-07 11:41