2012-11-06 20 views
11

बहुत समान to this questionगूंज "-n" प्रिंट नहीं करेगा -n?

मैं बाश में एक स्वचालित स्क्रिप्ट के साथ कुछ चीजों के माध्यम से पुनरावृत्ति कर रहा हूं। कभी-कभी लिपि "-n" में आ जाएगी और गूंज इसे समझने का प्रयास करेगा।

का प्रयास किया गया इस:

$ POSIXLY_CORRECT=1 /bin/echo -n 

और

$ POSIXLY_CORRECT=1 /bin/echo "-n" 

लेकिन यह तर्क हर बार की व्याख्या की।

फिर यह काम करता है, लेकिन तारों से बचने वाले पात्रों को मारना संभव है, इसलिए मैं सभी इनपुट और उपयोग के लिए एक शून्य चरित्र लागू नहीं करना चाहता हूं।

$ echo -e "\x00-n" 
-n 

printf संभव है, लेकिन जब तक कि वहाँ कोई अन्य विकल्प (सभी मशीनों एक उपयोगिता के रूप में printf चुके हैं) से परहेज किया है।

$printf "%s" "-n" 
-n 

तो क्या "-n" प्रिंट करने के लिए गूंज पाने का कोई तरीका है?

+1

और सवाल है? – choroba

+0

मेरा बुरा, इसे शीर्षक में छोड़ दिया। अंतिम पंक्ति में जोड़ा गया। – MrDoom

+0

टेंगेंशियल से संबंधित, http://everything2.com/title/The+UNIX+and+the+Echo – tripleee

उत्तर

8

printf आपके सभी गोले में अंतर्निहित होना चाहिए, जब तक कि आपकी कुछ मशीनों में पुराने पुराने संस्करण नहीं होते हैं। यह लंबे समय तक bash में अंतर्निहित है। यह शायद echo -e से अधिक पोर्टेबल है।

अन्यथा, echo विकल्प प्राप्त करने के लिए वास्तव में कोई तरीका नहीं है, इसकी परवाह है।

संपादित करें: an answer से दूसरे समान प्रश्न पर; इस आसान नहीं-डिजिटल अधिकार-बनाए रखा आवरण का उपयोग करके printf के साथ मुद्दों के हवाले से बचने:

ech-o() { printf "%s\n" "$*"; } 

(यही कारण है कि ech-ओ है, के रूप में "विकल्प के बिना")

+1

printf इको से अधिक पोर्टेबल है, लेकिन उस स्ट्रिंग को पास करना सुनिश्चित करें जिसे आप एक तर्क के रूप में मुद्रित करना चाहते हैं, * नहीं * एक प्रारूप स्ट्रिंग के रूप में (यानी 'printf"% s \ n "" $ stringfrint \ n "" स्ट्रिंगटॉप "के बजाय $ स्ट्रिंगटॉप" \ "" - @ djhaskin987 का उत्तर देखें। –

+0

@ गॉर्डन डेविसन: मैंने अहंकार से मेरा एक अलग जवाब से एक नोट जोड़ा, जो मुझे लगता है कि एक अच्छा समाधान है। – rici

+3

हां! '" $ * "' –

2

आप नाम sh साथ बैश आह्वान हैं , यह sh की नकल करेगा, जहां -n विकल्प echo पर उपलब्ध नहीं था। मुझे यकीन नहीं है कि यह आपकी आवश्यकताओं के अनुरूप है या नहीं।

$ /bin/sh -c 'echo -n' 
+0

वह '-n' POSIX.2 खोल कमांड विनिर्देशन में निर्दिष्ट नहीं है, यह असत्य रूप से असत्य है। '-n' के लिए विकल्प (गैर-स्ट्रिंग) व्यवहार 'echo' के लिए आधारभूत (गैर-XSI) मानक व्यवहार के हिस्से के रूप में निर्दिष्ट किया गया है; यह केवल वैकल्पिक एक्सएसआई एक्सटेंशन को लागू करने वाले गोले हैं जहां यह मौजूद नहीं है। Http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html देखें - अब, दिया गया है, _your_ '/ bin/sh' XSI का अनुसरण कर सकता है, लेकिन यह सार्वभौमिक रूप से गारंटीकृत नहीं है। –

4

क्या एक चरित्र ("x" उदाहरण के लिए) के साथ स्ट्रिंग लगाकर एक कट के साथ यात्रा के लिए उड़ान भरने हटा दिया जाता है कि के बारे में:

echo "x-n" | cut -c 2- 
3

गूंज "-n" को खोल बताता है इको के पहले तर्क, चरित्र के लिए चरित्र के रूप में '-n' डाल दें। अर्थात्, echo "-n"echo -n जैसा ही है। (यह एक POSIX मानक है और किसी भी खोल पर काम करना चाहिए) के बजाय इस प्रयास करें:

printf '%s\n' "-n" 
1

echo "-n" मुद्रित नहीं होगा -n क्योंकि -necho के लिए एक विकल्प के रूप में व्याख्या की है (help echo देखें)।लेकिन आप का उपयोग कर सकते हैं:

echo -e "\055n" 
+0

यह जीएनयू के 'इको' के कार्यान्वयन के साथ समर्थित है, लेकिन किसी भी पॉज़िक्स-अनुरूप संस्करण के साथ नहीं - एक ईएसआई-अनुपालन POSIX 'echo' के कार्यान्वयन को शाब्दिक '-e' प्रिंट करेगा, और एक गैर-XSI कोई नहीं होगा '055' की व्याख्या करें। दरअसल, यदि आप एक जीएनयू सिस्टम पर POSIXLY_CORRECT = 1' निर्यात करते हैं, तो आप पूर्व व्यवहार देखेंगे। –

0

चीटिंग विधि:

echo -e "\r-n" 
+0

... जो काम करता है यदि आपका आउटपुट मानव उपभोग के लिए है, लेकिन यदि यह किसी प्रोग्राम या अन्य गैर-टर्मिनल उपभोक्ता द्वारा पढ़ा नहीं जाता है। –

संबंधित मुद्दे