बैश में, मैं एक विस्मयादिबोधक चिह्न से कैसे बचूं?


183

मैं कुछ ऐसा करना चाहता हूं bzr commit -m "It works!"। मैं कर के विस्मयादिबोधक चिह्न से बच सकते हैं bzr commit -m "It works\!"। हालाँकि, तब मेरे प्रतिबद्ध संदेश में बैकस्लैश शामिल है। मैं बैकलैश को अनदेखा करते हुए, विस्मयादिबोधक चिह्न से कैसे बचूं?


1
काम bzr commit -m "It works"!करता है, भी।
kba

1
जैसा कि मैंने आपके द्वारा बताए गए आदेश से पहले उल्लेख किया था कि यह वास्तव में खुद पर काम करता है :)bzr commit -m "It works!"
h4unt3r

नेस्टेड कोट्स के साथ एक भी क्विकर केस: stackoverflow.com/questions/22125658/…
Ciro Santilli Sant case case case

1
यद्यपि स्वीकृत उत्तर आपकी प्रतिबद्ध समस्याओं के लिए एक अच्छा समाधान है, मुझे लगता है कि यह वास्तविक मुद्दे का जवाब नहीं है: बैश इतिहास विस्तार । कृपया डेनिस के उत्तर को स्वीकार करने पर विचार करें?
अर्जन

जवाबों:


153

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

bzr commit -m 'This does work!' 

24
चूंकि सवाल था "मैं विस्मयबोधक चिह्न से कैसे बचूँ?" और नहीं "मैं विस्मयबोधक चिह्न का विस्तार कैसे नहीं कर सकता हूं?" मुझे नहीं लगता कि यह मान्य है। कुछ समय होते हैं (जैसे एक ही कमांड-लाइन में एपोस्ट्रोफ और विस्मयादिबोधक चिह्न पास करते समय) यह काम नहीं करता है। नीचे दिए गए जवाब बहुत बेहतर काम करते हैं जो कई लोगों को चाहिए।
Jann

7
@ जन्न: आप इस पर 100% सही हैं, लेकिन मुझे लगता है कि यहाँ मुद्दा यह है कि सुपरसुसर पर इतने सारे प्रश्न हैं: क्या हम इस प्रश्न का उत्तर बिंदु पर देते हैं, या क्या हम लोगों को उनकी विशिष्ट समस्या को हल करने में मदद करते हैं। मुझे लगता है कि दोनों तरीके उपयोगी हो सकते हैं, और यह एक विशिष्ट मुद्दे पर मदद की तलाश में था।
बेंजामिन बैनियर

ट्च! यह एक विशिष्ट मुद्दा था। मैं बस अपने सवालों का जवाब चाहता हूं ताकि कई स्थितियों में इस्तेमाल किया जा सके। pS: जिस कारण से मैंने इसका उल्लेख किया वह यह था कि मुझे एक एपोस्ट्रोफ और एक विस्मयादिबोधक चिह्न दोनों को एक पर्ल प्रोग्राम में पास करने की आवश्यकता थी और मुझे नीचे दिए गए समाधान की आवश्यकता थी। :)
Jann

मैं बेंजामिन और जन्न दोनों से सहमत हूं, लेकिन एक डाउनवोट दिया। प्रश्न का शीर्षक खोज इंजन द्वारा अनुक्रमित किया गया है और इस तरह से मैं यहां आया हूं और शायद अधिकांश उपयोगकर्ता यहां आते हैं। इसलिए मेरा मानना ​​है कि यह महत्वपूर्ण है कि वास्तविक प्रश्न इसके पीछे की समस्या को दर्शाता है। अन्य मंचों में लोगों को सलाह दी जाती है कि वे क्या पूछते हैं। खराब व्यक्त किए गए प्रश्नों के उत्तर देना धीमेपन का समर्थन करता है और यही मेरे पतन का सटीक कारण है। एक समझौता / समाधान के रूप में मेरा सुझाव शीर्षक को अनुकूलित करने में मदद करना है ताकि यह वास्तविक समस्या को दर्शाता है।
क्रिस्टोफके

153

यहाँ एक और तरीका है यदि आप दोहरे उद्धरण चिह्नों के साथ-साथ विस्मयादिबोधक चाहते हैं:

echo "It's broken"'!'

यह तब भी काम करता है जब रेखा !के अंत में नहीं है।

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

echo "hello there"'!'" and goodbye"

बोनस: श या बैश में किसी भी पाठ से बचने के लिए एक समान तकनीक का उपयोग किया जा सकता है (sed की मदद से): इस उत्तर में पहला विकल्प देखें । इसके अलावा, अगर आप की है bash-completionस्थापित है, आप की संभावना है समारोह पहले से ही उपलब्ध।quote()


4
अच्छा टिप, JWD। मुझे नहीं पता था कि उनके बीच व्हाट्सएप को छोड़ कर बस स्ट्रिंग्स को कंसट्रेट किया जा सकता है।
एलन एच।

वास्तव में यदि विस्मयादिबोधक चिह्न स्ट्रिंग के अंत में है तो आप स्पष्ट echo "Happy birthday!"रूप में काम करेंगे, अन्यथा आप इसे बैकस्लैश के साथ बचा सकते हैं, लेकिन बैकलैश मुद्रित किया जाएगा और साथ ही एक्सडी बैश दिल के बेहोश के लिए नहीं है :)
h4unt3r

@ h4unt3r: अजीब, यह मेरा अनुभव नहीं है। मेरे लिए, echo "Happy Birthday!"2 लाइनें आउटपुट। पहला है echo "Happy birthday"(कोई विस्मयादिबोधक), और दूसरा "हैप्पी बर्थडे" (फिर से, कोई विस्मयादिबोधक नहीं है)। क्या आपके पास यह परीक्षण करते समय इतिहास विस्तार चालू है?
jwd

@jwd क्या संस्करण चला रहे हैं? मेरा हमेशा से विस्तार रहा है। क्या आपने गलती से दो का उपयोग किया था !! अपने परीक्षण के लिए?
h4unt3r

@ h4unt3r:, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)निश्चित रूप से केवल एक !का उपयोग किया जा रहा है। में histexpandउपस्थित हूँ $SHELLOPTS। हालाँकि, मैंने केवल ४.३.१ ((२) का प्रयास किया था, एक अन्य मशीन पर -Reaseease, और यह वर्णित के रूप में व्यवहार करता है। मुझे लगता है कि यह एक बग था जो तय हो गया।
jwd

66

इतिहास विस्तार बंद करें :

set +H

या

set +o histexpand

~/.bashrcयदि आप आमतौर पर इतिहास विस्तार का उपयोग नहीं करते हैं, तो आप उनमें से एक कमांड जोड़ सकते हैं ।

बैश 4.3 ने एक विशेष मामला जोड़ा :

इतिहास विस्तार चरित्र भी उद्धृत के रूप में माना जाता है अगर यह तुरंत एक डबल-उद्धृत स्ट्रिंग में समापन दोहरे उद्धरण से पहले होता है


धन्यवाद - यह काम किया, लेकिन मुझे करना था set +o histexpand, नहीं set -o histexpand। क्या आप इसे ठीक करने के लिए अपना उत्तर संपादित कर सकते हैं?
मैथ्यू

उफ़, टाइपो, सॉरी। फिक्स्ड।
डेनिस विलियमसन

उत्कृष्ट! AGES के लिए इस के लिए देख रहा था .... thm vm! बचने के काम के रूप में ... मैं भी एकल उद्धरण का उपयोग नहीं करना चाहता ... मैं इसे अपने .bashrcthx में जोड़ दूंगा !!, !लिपियों में कभी नहीं और कुछ भी नहीं के लिए इस्तेमाल किया !! यह हमेशा परेशान था ...
कुंभ राशि

यह तो कमाल है! echo "@AquariusPower!"
जोहाना

12

डबल कोट्स (") के बजाय सिंगल कोट्स (') का प्रयोग करें। सिंगल कोट्स उन में सामान की सभी व्याख्या को बंद कर देते हैं, जबकि डबल कोट्स केवल कुछ को चालू करते हैं।

bzr commit -m 'It works!'

4

मुझे अभी एक और रास्ता मिला है, जो कम से कम echoआईएनजी स्ट्रिंग्स (वाक्यों) के साथ काम करेगा जिसे आप विस्मयादिबोधक बिंदु के साथ पंचर करना चाहते हैं। यह बैश हिस्टेक्पैंड के चारों ओर कम-से-कम एक अंत-रन करता है, और कोड के लिए केवल थोड़ा अधिक समय लेता है।

एक विस्मयादिबोधक बिंदु के लिए हेक्स, जैसा कि http://www.ascii-code.com/ पर सूचीबद्ध है , 21 वर्ष का है, इसलिए यदि आप \x21अपनी स्ट्रिंग के अंत में रखते हैं echo -e $foo, तो $fooअपना स्वयं का विस्तारित प्रतिध्वनि बनाएं (यानी foo=$(echo -e "$foo")], जो आप जब आप echo $fooफिर से !अंत में स्ट्रिंग के साथ हो। और कोई स्विचिंग histexpand भी नहीं।

बाश 4+ में निश्चित रूप से काम करता है। पहले के संस्करण, ymmv।


हम्म्म यह मेरे लिए काम नहीं करता है।
लजाप

मुझे वह नहीं मिलता, जो आप स्वयं गूँज रहे हैं। 'इको-ई ’और' प्रिंटफ’ व्याख्या ओक्टेल, हेक्स और यूनिकोड कोड से बच गए। उन मामलों में जहां आप दोनों में से किसी एक का उपयोग कर रहे हैं, आप विस्मय बोधक बिंदु के लिए "\" 041 "("! "के लिए अष्टक) या" \ x21 "(हेक्स) का उपयोग कर सकते हैं। उदाहरण के लिए printf "OMG\041":। यदि आप कहीं डबल-स्ट्रिंग स्ट्रिंग का निर्माण कर रहे हैं जो कि इको या प्रिंटफ नहीं है, जैसे कि प्रतिबद्ध स्ट्रिंग ओपी के बारे में पूछा गया है, तो आप $(echo -e "\041")स्ट्रिंग में एम्बेड कर सकते हैं जहां विस्मयादिबोधक बिंदु होना चाहिए। इस तरह bzr commit -m "This is a great commit$(echo -e "\041")":।
टॉड वाल्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.