गूंज "बार" क्यों-गूंज "बार" से अलग है?


10

तुलना

echo -n "bar"

साथ में

echo "bar" -n

पूर्व वह करता है जो मुझे लगता है कि यह करना है (प्रिंट्स "बार" बिना किसी नई रेखा के), जबकि बाद वाला नहीं करता है। यह एक बग है या डिजाइन से? क्यों यह कई cli प्रोग्राम्स से अलग है जिसमें आप विकल्पों को इधर-उधर नहीं कर सकते हैं? उदाहरण के लिए, tail -f /var/log/messagesबिल्कुल उसी के समान है tail /var/log/messages -f। मैं कभी-कभी बाद में करता हूं जब मैं भूल जाता हूं कि मैं पूर्व चाहता था, क्योंकि आंतरिक रूप से विकल्पों और तर्कों को पुनर्व्यवस्थित किया जाता है, आमतौर पर गेटअप द्वारा ।

अपडेट: हां मैं मूल रूप से अपने प्रश्न का संपादन करता हूं। मैंने nerf को हटा दिया है कि आपको कुछ जवाब देने के लिए इतिहास देखना पड़ेगा।


3
मैं क्या देख से, अंतर है तुरंत स्पष्ट। echo -n "bar""बार" echo "bar" -nदेता है , जबकि "बार-एन" देता है
फन्नेहे

जवाबों:


18

जैसा कि ज्यादातर अन्य लोगों ने देखा है, "-n" का शाब्दिक अर्थ है अगर कहीं भी रखा जाए, लेकिन echoकमांड के तुरंत बाद ।

ऐतिहासिक रूप से, UNIX उपयोगिताओं सभी इस तरह थे - वे केवल कमांड नाम के तुरंत बाद विकल्पों की तलाश करते थे। यह संभवतः बीएसडी या जीएनयू था, जिसने अधिक लचीली शैली का नेतृत्व किया (हालांकि मैं गलत हो सकता है), क्योंकि अब भी पोसिक्स पुराने तरीके को सही के रूप में निर्दिष्ट करता है (दिशानिर्देश 9 देखें, और man 3 getoptलिनक्स सिस्टम पर भी )। वैसे भी, हालांकि अधिकांश लिनक्स उपयोगिताओं में इन दिनों नई शैली का उपयोग किया जाता है, कुछ होल्डआउट्स जैसे हैं echo

Echoएक गड़बड़ी, मानकों के लिहाज से, इसमें POSIX के अस्तित्व में आने से कम से कम दो मौलिक रूप से परस्पर विरोधी संस्करण थे। एक तरफ, आपके पास एसवाईएसवी-शैली है, जो बैकस्लैश-बच गए वर्णों की व्याख्या करती है, लेकिन अन्यथा इसके तर्कों का शाब्दिक रूप से व्यवहार करती है, कोई विकल्प स्वीकार नहीं करता है। दूसरे पर, आपके पास बीएसडी-शैली है, जो एक प्रारंभिक -nमामले को एक विशेष मामले के रूप में मानता है और शाब्दिक रूप से बाकी सब कुछ आउटपुट करता है। और चूंकि echoयह बहुत सुविधाजनक है, आपके पास हजारों शेल स्क्रिप्ट हैं जो एक व्यवहार या दूसरे पर निर्भर करती हैं:

echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --

"सब कुछ का शाब्दिक व्यवहार" शब्दार्थ के कारण, echoचीजों को तोड़े बिना एक नया विकल्प जोड़ना भी असंभव है । अगर GNU ने इस पर लचीले विकल्प योजना का उपयोग किया, तो नरक ढीली हो जाएगी।

संयोग से, बॉर्न शेल कार्यान्वयन के बीच सर्वोत्तम संगतता के लिए, बजाय उपयोग करेंprintfecho

echoविशेष रूप से लचीले विकल्पों का उपयोग क्यों नहीं करता है, यह स्पष्ट करने के लिए अद्यतन किया गया ।


अपवोट होने के बाद से आप केवल एक ही उल्लेख कर सकते हैं जो अपेक्षित गेटअप व्यवहार है।
जेफ्री बाचेलेट

@ जेंडर क्यों गूंजता है "होल्डआउट"? मुझे लगता है कि यह गनु कोरुटिल है?
xenoterracide

@xeno: मैंने अपना जवाब अपडेट कर दिया है। मूल रूप से, GNU चीजों को तोड़ना नहीं चाहता था।
जंतर

1
पहले गैर-विकल्प के बाद विकल्पों को स्वीकार करना GNU उपयोगिताओं और कार्यक्रम के लिए विशिष्ट है, जो GNU libc के गेटअप सुविधाओं का उपयोग करता है। उपयोगकर्ता हमेशा पर्यावरण चर सेट करके पिछड़े-संगत व्यवहार प्राप्त कर सकता है POSIXLY_CORRECT
गिल्स एसओ- बुराई को रोकना '

1
के विशिष्ट मामले के लिए echo, ऐसे कार्यान्वयन भी हैं जो विकल्प के रूप में पहचानते हैं -eया -Eकरते हैं। पोर्टेबिलिटी के लिए, किसी -चीज़ के साथ शुरुआत या उपयोग न करें printf %s -e
गाइल्स का SO-

9

अन्य उत्तर इस बिंदु पर पहुंचते हैं कि आप मैन पेज को देखने के लिए देख सकते हैं कि एन-स्ट्रिंग से इको का हिस्सा बन रहा है। हालाँकि मैं केवल यह बताना चाहता हूं कि md5sum के बिना इसकी जांच करना आसान है और बनाता है जो थोड़ा कम गूढ़ है।

[11:07:44][dasonk@Chloe:~]: echo -n "bar"
bar[11:07:48][dasonk@Chloe:~]: echo "bar" -n
bar -n

3
+1 बिल्कुल। यदि एक पाइपलाइन वह नहीं कर रहा है जिसकी आप अपेक्षा करते हैं, तो प्रत्येक भाग का अलग-अलग परीक्षण करें।
मिकेल

6

वाह, सभी की व्याख्याएं लंबी हैं।

यह इतना आसान है:

-n एक विकल्प है अगर यह स्ट्रिंग से पहले दिखाई देता है, अन्यथा यह एक और स्ट्रिंग है जिसे प्रतिध्वनित किया जाना है।

निकालें | md5sum और आप देखेंगे कि आउटपुट अलग है।


5

सरल निरीक्षण से, यह डिज़ाइन द्वारा बग नहीं है ...

echo "bar" -n | md5sum

a3f8efa5dd10e90aee0963052e3650a1

इस कमांड को अपने लिए आज़माएँ:

echo "bar -n" | md5sum

आप देखेंगे कि परिणामी md5 है

a3f8efa5dd10e90aee0963052e3650a1

आप सिर्फ इको में -n के उपयोग को मिश्रित करते हैं।

अपने पहले सैंपल कोड में

echo -n "bar" | md5sum

-इस गूंज के बाद नई लाइन लगाने के लिए डीओ नॉट कहने के लिए उपयोग किया जाता है।

आपका दूसरा नमूना

echo "bar" -n | md5sum

एक शाब्दिक पाठ के रूप में एक इलाज है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.