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


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


165
2018-04-22 18:53


मूल


करते हुए bzr commit -m "It works"! काम करता है, भी। - kba
जैसा कि मैंने आपके द्वारा दिए गए आदेश से पहले नोट किया है वास्तव में अपने आप पर काम करता है :) bzr commit -m "It works!" - h4unt3r
नेस्टेड उद्धरण के साथ एक भी quirkier मामला: stackoverflow.com/questions/22125658/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
हालांकि स्वीकृत उत्तर आपकी प्रतिबद्धताओं के लिए एक अच्छा कामकाज है, मुझे लगता है कि यह वास्तविक मुद्दे का उत्तर नहीं है: बैश इतिहास विस्तार। डेनिस के जवाब को स्वीकार करने पर विचार करें? - Arjan


जवाब:


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

bzr commit -m 'This does work!' 

136
2018-04-22 19:31



चूंकि सवाल था "मैं विस्मयादिबोधक चिह्न से कैसे बचूं?" और नहीं "मैं विस्मयादिबोधक चिह्न का विस्तार कैसे नहीं करूं?" मुझे नहीं लगता कि यह मान्य है। कुछ बार होते हैं (जैसे एक ही कमांड लाइन में एस्ट्रोफ़ेस और विस्मयादिबोधक अंक पारित करते समय) यह काम नहीं करता है। नीचे दिया गया जवाब बहुत से लोगों को करने के लिए बहुत बेहतर काम करता है। - Jann
@ जेन: आप इस पर 100% सही हैं, लेकिन मुझे लगता है कि यह मुद्दा यहां सुपरसियर पर इतने सारे प्रश्नों वाला है: क्या हम इस मुद्दे पर सवाल का जवाब देते हैं, या क्या हम लोगों को उनकी विशिष्ट समस्या को हल करने में मदद करते हैं। मुझे लगता है कि दोनों तरीकों से उपयोगी हो सकता है, और यह एक विशिष्ट मुद्दे पर मदद की तलाश में था। - Benjamin Bannier
ट्च! यह एक विशिष्ट मुद्दा था। मैं बस कई स्थितियों में इस्तेमाल होने में सक्षम होने के लिए अपने प्रश्नों का उत्तर देना चाहता हूं। पीएस: जिस कारण से मैंने इसका उल्लेख भी किया था, मुझे एक एस्ट्रोफ़े और एक विस्मयादिबोधक चिह्न को एक पर्ल कार्यक्रम में पारित करने की आवश्यकता थी और मुझे नीचे दिए गए समाधान की आवश्यकता थी। :) - Jann
मैं बेंजामिन और जैन दोनों से सहमत हूं लेकिन एक डाउनवोट दिया। प्रश्न का शीर्षक खोज इंजन द्वारा अनुक्रमित किया गया है और इस तरह मैं यहां आया था और शायद अधिकांश उपयोगकर्ता यहां आते हैं। यही कारण है कि मेरा मानना ​​है कि यह महत्वपूर्ण है कि वास्तविक प्रश्न इसके पीछे की समस्या को दर्शाता है। अन्य मंचों में लोगों को सलाह दी जाती है कि वे ठीक से पूछें कि वे क्या देख रहे हैं। खराब व्यक्त प्रश्नों का उत्तर ढलान का समर्थन करता है और यह मेरे डाउनवोट के लिए सही कारण है। एक समझौता / समाधान के रूप में मेरा सुझाव शीर्षक को अनुकूलित करने में मदद करना है ताकि यह वास्तविक समस्या को दर्शाता हो। - ChristophK


पुराना सवाल मुझे पता है, लेकिन भविष्य के खोजकर्ताओं के लिए:

यदि आप डबल कोट्स के साथ-साथ विस्मयादिबोधक चाहते हैं तो आप इस विधि का भी उपयोग कर सकते हैं:

echo "It's broken"'!'

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

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

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

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


141
2018-06-23 19:16



अच्छा टिप, जेडब्ल्यूडी। मुझे एहसास नहीं हुआ कि बैश तारों को उनके बीच सफेद जगह छोड़कर बस संयोजित किया जा सकता है। - Alan H.
दरअसल यदि विस्मयादिबोधक चिह्न स्ट्रिंग के अंत में है तो आप स्पष्ट हैं 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। हालांकि, मैंने अभी 4.3.18 (2) कोशिश की है - किसी अन्य मशीन पर कृपया, और जैसा कि आपने वर्णन किया है, यह व्यवहार करता है। मुझे लगता है कि यह एक बग था जो तय हो गया। - jwd


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

set +H

या

set +o histexpand

63
2018-04-22 18:58



धन्यवाद - यह काम किया, लेकिन मुझे करना था set +o histexpand, नहीं set -o histexpand। क्या आप इसे ठीक करने के लिए अपना उत्तर संपादित कर सकते हैं? - Matthew
ओह, टाइपो, क्षमा करें। फिक्स्ड। - Dennis Williamson
उत्कृष्ट! एजीईएस के लिए इसकी तलाश कर रहा था .... thx vm! जैसे बच निकलती है ... मैं भी एकल कोट्स का उपयोग नहीं करना चाहता ... मैं इसे अपने साथ जोड़ दूंगा .bashrc thx !!, कभी नहीं इस्तेमाल किया ! लिपियों में और कुछ भी नहीं !! यह हमेशा परेशान था ... - Aquarius Power
यह तो कमाल है! echo "@AquariusPower!" - joehanna


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

bzr commit -m 'It works!'

9
2018-04-22 19:32





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

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

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


4
2017-11-23 04:28



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