जवाबों:
echo -e ' \t '
गूंज जाएगा 'स्पेस टैब स्पेस न्यूलाइन' ( -e
मतलब 'बैकस्लैश एस्केप की व्याख्या सक्षम करें'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
Makefiles से काम क्यों नहीं होता है?
echo -e
है क्योंकि POSIX और make
कॉल /bin/sh
नहीं है जो आम तौर पर प्रोग्राम का उपयोग इंटरएक्टिव उपयोग नहीं है, और सामान्य रूप से -e
लागू नहीं होता है। पोर्टेबिलिटी के लिए, printf '\t'
इसके बजाय उपयोग करें ।
man
लिए पृष्ठ echo
विकल्प का उल्लेख नहीं करता है -e
। हालाँकि, यह विकल्प स्वीकार किया जाता है।
का उपयोग करें printf
, नहीं echo
।
echo
कमांड के कई अलग-अलग संस्करण हैं । वहाँ /bin/echo
(जो सिस्टम के आधार पर GNU Coreutils संस्करण हो सकता है या नहीं भी हो सकता है), और echo
कमांड अधिकांश शेल में बनाया गया है। अलग-अलग संस्करणों में नियंत्रण वर्णों के लिए पलायन को निर्दिष्ट या अक्षम करने के लिए अलग-अलग तरीके (या कोई रास्ता नहीं) हैं।
printf
दूसरी ओर, बहुत कम भिन्नता है। यह एक कमांड के रूप में मौजूद हो सकता है, आम तौर पर /bin/printf
, और यह कुछ गोले में निर्मित होता है (बैश और जेडश में यह है, tsh और ksh नहीं है), लेकिन विभिन्न संस्करण अलग-अलग संस्करणों की तुलना में एक दूसरे के समान echo
हैं। और आपको कमांड-लाइन विकल्प (कुछ अपवादों के साथ) को याद करने की आवश्यकता नहीं है; GNU Coreutils प्रिंटफ एक्सेप्ट --version
और --help
, और बिल्ट-इन प्रिंट प्रिंट स्वीकार करता है-v var
एक वेरिएबल में आउटपुट को स्टोर करने के लिए है) याद नहीं है।
अपने उदाहरण के लिए:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
और अब मेरे लिए यह स्वीकार करने का समय है कि echo
आप जिस उदाहरण के बारे में पूछ रहे हैं, उसके लिए भी काम करेगा; आपको बस तर्क के आसपास दोहरे उद्धरण चिह्नों की आवश्यकता है:
echo "[$res]"
के रूप में kmkaplan ने लिखा (ढाई साल पहले, मैंने अभी देखा!)। अपने मूल आदेशों के साथ समस्या:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
साथ नहीं है echo
; यह ऐसा है कि शेल ने टैब को एक स्पेस के साथ बदल दिया echo
है।
echo
सरल आउटपुट के लिए ठीक है, जैसे echo hello world
, लेकिन printf
जब भी आप कुछ और अधिक जटिल करना चाहते हैं तो आपको इसका उपयोग करना चाहिए । आप काम करने के लिए प्राप्त कर सकते हैं echo
, लेकिन परिणामी कोड विफल होने की संभावना है जब आप इसे एक अलग echo
कार्यान्वयन या एक अलग शेल के साथ चलाते हैं ।
आप भी आजमा सकते हैं:
echo Hello$'\t'world.
आपको इको के लिए-फ्लैग का उपयोग करने की आवश्यकता है तब आप कर सकते हैं
echo -e "\t\t x"
बैश मैन पेज से:
फॉर्म $ 'स्ट्रिंग' के शब्दों को विशेष रूप से व्यवहार किया जाता है। यह शब्द ANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ स्ट्रिंग में फैलता है।
तो आप यह कर सकते हैं:
echo $'hello\tworld'
का प्रयोग करें शब्दशः कीस्ट्रोक, ^V
( CTRL+V
, C-v
, जो कुछ भी )।
जब आप ^V
टर्मिनल (या अधिकांश यूनिक्स संपादकों) में टाइप करते हैं, तो निम्न वर्ण शब्दशः लिया जाता है । आप इसे एक स्ट्रिंग के अंदर शाब्दिक टैब वर्ण टाइप करने के लिए उपयोग कर सकते हैं जिसे आप गूँज रहे हैं।
निम्नलिखित कार्यों की तरह कुछ:
echo "^V<tab>" # CTRL+V, TAB
बैश डॉक्स ( qv , "उद्धृत-डालें")
quoted-insert (Cq, Cv) अगला वर्ण जो आप लाइन वर्बेटिम में लिखते हैं, जोड़ें। उदाहरण के लिए, Cq जैसे प्रमुख अनुक्रम सम्मिलित करना है।
साइड नोट: इस के अनुसार, ALT+TAB
एक ही काम करना चाहिए, लेकिन हम सभी उस क्रम को विंडो स्विचिंग के लिए बाध्य करते हैं ताकि हम इसका उपयोग न कर सकें
टैब-इन्सर्ट (M-TAB) एक टैब कैरेक्टर डालें।
-
नोट: आप सभी प्रकार के असामान्य पात्रों के साथ इस रणनीति का उपयोग कर सकते हैं। गाड़ी वापसी की तरह:
echo "^V^M" # CTRL+V, CTRL+M
ऐसा इसलिए है क्योंकि गाड़ी वापसी ASCII 13 है, और M वर्णमाला का 13 वां अक्षर है, इसलिए जब आप टाइप करते हैं, तो आपको ^M
13 वां ASCII वर्ण मिलता है। आप इसे ls^M
खाली प्रॉम्प्ट पर एक्शन का उपयोग करते हुए देख सकते हैं , जो एक गाड़ी रिटर्न को सम्मिलित करेगा, जिससे प्रॉम्प्ट ठीक उसी तरह काम करेगा जैसे आप रिटर्न मारते हैं। जब इन पात्रों की आम तौर पर व्याख्या की जाती है, तो शब्दशः आपको शाब्दिक चरित्र मिल जाता है।
grep
को पकड़ने वाली लाइनों को पकड़ने के लिए उपयोग करने की कोशिश करते समय मेरा दिन बचाया tab
।
वैरिएबल के मानों को प्रिंट करने के लिए इको का उपयोग करना एक सामान्य बैश नुकसान है। संदर्भ लिंक: