क्यों wc <<< "$ स्ट्रिंग" प्रिंटफ की तुलना में एक-बाइट-लंबी लंबाई दिखाता है "$ स्ट्रिंग" | स्वागत?


11

अकस्मात, मुझे पता चला कि wcयह बैश से इनपुट कैसे प्राप्त होता है, इस पर निर्भर करता है:

$ s='hello'
$ wc -m <<<"$s"
6
$ wc -c <<<"$s"
6
$ printf '%s' "$s" | wc -m
5
$ printf '%s' "$s" | wc -c
5

यह है - IMHO भ्रमित - व्यवहार कहीं दस्तावेज? wcयहाँ क्या गिना जाता है - क्या यह एक ग्रहण की गई नई रूपरेखा है?


3
आप हमेशा od -cवही देख सकते हैं जो आपके पास है।
थोर्बोजर्न रावन एंडरसन

या, बेहतर xxd -g1,।
रुस्लान

1
मुझे आशा printf "$s"है कि आपकी वास्तविक स्क्रिप्ट नहीं है ... उम्मीद है कि आपका मतलब हैprintf "%s" "$s"
user541686

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

जवाबों:


38

अंतर यहां स्ट्रिंग में जोड़े गए एक नई रेखा के कारण होता है। बैश मैनुअल देखें :

परिणाम को एक स्ट्रिंग के रूप में आपूर्ति की जाती है, जो कि एक नई पंक्ति के साथ संलग्न होती है, इसके मानक इनपुट पर कमांड के लिए (या फ़ाइल डिस्क्रिप्टर n यदि n निर्दिष्ट है)।

wc उसी तरह से गिना जा रहा है, लेकिन इसका इनपुट अलग है।


7
ध्यान दिया जाना चाहिए, तो एक अतिरिक्त न्यू लाइन चरित्र के बिना (मनमाने ढंग से) एक चर की सामग्री को मुद्रित करने के लिए है कि, यह होना चाहिए printf %s "$var"(या print -rn -- "$var"गोले की तरह ksh के साथ), नहीं printf "$var"जो सही ढंग से मूल्यों के लिए काम नहीं करेंगे $var, जिनमें शामिल है %या बैकस्लैश वर्ण (या -सबसे कार्यान्वयन के साथ शुरू करें )।
स्टीफन चेजेलस

ध्यान दें कि यूनिक्स पोर्ट में मूल यहाँ स्ट्रिंग कार्यान्वयन rcने उस न्यूलाइन वर्ण को नहीं जोड़ा है।
स्टीफन चेज़लस

26

यह एक सफल नई लाइन है जिसे यहां स्ट्रिंग-पुनर्निर्देशक द्वारा जोड़ा गया है:

$ s="hello"
$ hexdump -C <<<"$s"
00000000  68 65 6c 6c 6f 0a                                 |hello.|
00000006
$ printf "$s" | hexdump -C
00000000  68 65 6c 6c 6f                                    |hello|
00000005
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.