मुझे पता है कि !कमांडलाइन इतिहास के संदर्भ में कमांडलाइन पर विशेष महत्व है, लेकिन इससे अलग, एक रनिंग स्क्रिप्ट में विस्मयादिबोधक चिह्न कभी-कभी एक पार्सिंग त्रुटि का कारण बन सकता है।
मुझे लगता है कि यह एक के साथ कुछ करना है event, लेकिन मुझे नहीं पता कि एक घटना क्या है या यह क्या करता है। फिर भी, एक ही कमांड अलग-अलग स्थितियों में अलग-अलग व्यवहार कर सकता है।
अंतिम उदाहरण, नीचे, एक त्रुटि का कारण बनता है; लेकिन क्यों, जब एक ही कोड कमांड प्रतिस्थापन के बाहर काम करता है? .. GNU बैश का उपयोग 4.1.5
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protectedऔर अधिक उपयुक्त होगा। ('सिंगल कोट्स' द्वारा संरक्षित)
var=$(…)(कोई दोहरे उद्धरण नहीं) का उपयोग कर सकते हैं , और यह आपकी अपेक्षा के अनुसार काम करेगा (मुझे लगता है)। यह अभी भी "सुरक्षित" है, क्योंकि एक साधारण कार्य के मूल्य भाग शब्द बंटवारे के अधीन या ग्लोबिंग (हालांकि यह जैसे builtins के माध्यम से किया (कार्य की सच नहीं हो सकता नहीं है export, localआदि सभी के गोले के तहत))। दुर्भाग्य से, यह सरल असाइनमेंट से आगे नहीं बढ़ता है क्योंकि डबल कोट्स शब्द विभाजन और ग्लोबिंग से बचाने का तरीका है जबकि अन्य संदर्भों में अभी भी अन्य प्रकार का विस्तार हो रहा है।