इको न्यूलाइन कैरेक्टर बैश में काम नहीं कर रहा है


13

मैं bash स्क्रिप्ट जिनमें से बहुत से है echoबयानों और भी मैं एलियास echoके लिए echo -eदोनों में .bash_profileऔर .bashrcहै, ताकि नई लाइनों एक बयान के लिए ठीक से मुद्रित कर रहे हैं की तरह echo 'Hello\nWorld'उत्पादन होना चाहिए

Hello
World

लेकिन मुझे जो आउटपुट मिल रहा है वह है

Hello\nWorld

मैं भी shopt -s expand_aliasesस्क्रिप्ट में उपयोग करने की कोशिश की , यह मदद नहीं करता है

मैं अपनी स्क्रिप्ट के रूप में चला रहा हूं bash /scripts/scriptnm.sh; अगर मैं इसे चलाने के रूप में . /scripts/scriptnm.shमैं वांछित उत्पादन हो रहा है ...


3
अलियासिंग echoकी तरह आप चाहते हैं एक बुरा व्यवहार IMHO है
shellholic

1
दोहरे उद्धरण चिह्नों का उपयोग करें जो \ n व्याख्या करता है। एकल उद्धरण \ n की व्याख्या और अन्य चीजों के एक समूह को रोकते हैं।
बिलथोर

जवाबों:


16

मिश्रित इतिहास का echoअर्थ है कि इसका डिफ़ॉल्ट ऑपरेशन शेल से शेल में भिन्न होता है। POSIX निर्दिष्ट करता है कि echoयदि "पहला तर्क है -nया किसी तर्क में बैकस्लैश है तो" कार्यान्वयन-परिभाषित " का परिणाम है ।

यह उपयोग करने के लिए अधिक विश्वसनीय है printf(या तो एक अंतर्निहित कमांड या एक बाहरी कमांड के रूप में) जहां व्यवहार अधिक अच्छी तरह से परिभाषित किया गया है: सी-स्टाइल बैकस्लैश से बच जाता है और प्रारूप स्ट्रिंग (पहले तर्क) में प्रारूप विनिर्देशक का समर्थन किया जाता है।

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

आप शेल विकल्प के साथ बैश के echoअंतर्निहित कमांड के बैकस्लैश एस्केप दृश्यों के विस्तार को नियंत्रित कर सकते हैं xpg_echo

किसी भी बैश स्क्रिप्ट के शीर्ष पर इसे सेट करें ताकि प्रत्येक इको कमांड echoको जोड़ने के बिना बैकस्लैश से बचने के लिए स्वचालित रूप से विस्तार किया जा सके -e

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; मेरे लिए काम किया।
बैशूसर

6

जब आप उपयोग करते हैं bash myfile.sh, तो बैश को "बैच" मोड में, एक अलग प्रक्रिया पर चलाया जाता है, और इसकी प्रोफ़ाइल या आरसीफाइल को नहीं पढ़ा जाता है।

जब आप का उपयोग . myfile.sh, फ़ाइल है sourced वर्तमान खोल प्रक्रिया द्वारा (जैसे कि इसकी सामग्री आपके द्वारा टाइप किया गया था), इसलिए यह आपके वर्तमान में परिभाषित उपनाम देखता है।

सामान्य तौर पर, यह स्क्रिप्ट लिखने के लिए एक बहुत बुरा विचार है जो किसी विशेष शेल कॉन्फ़िगरेशन पर निर्भर करता है, विशेष रूप से उपनाम, जब तक आप उन्हें स्क्रिप्ट में ही परिभाषित नहीं करते । ( कभी.bashrc भी उपयोगकर्ता पर भरोसा करें , भले ही वह आपका अपना हो।)


5

अनुशंसित अभ्यास printfसभी नई लिपियों के लिए उपयोग करना है।

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"

इको की तुलना में +1 प्रिंटफ़ थोड़ा अधिक जटिल है, लेकिन यह ईको की विसंगतियों से बचने के लिए भुगतान करने से अधिक है।
गॉर्डन डेविसन

1

यह टर्मिनल में ठीक काम करता है

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

किसी फ़ाइल में सेव करें और इसे एक्स्यूटेबल (chmod + x) बनाएं

as ./your_file चलाएं


इसे bash your_file के रूप में चलाएं और आउटपुट चेक करें।
बाशूसर

उम्मीद के
मुताबिक

लेकिन प्रतिध्वनि "हैलो \ n वर्ल्ड" अपेक्षित आउटपुट नहीं दिखा रही है। जैसा कि गूंज पहले से ही गूंज रहा है-वैसे, लेकिन यह काम नहीं कर रहा है और मेरे सवाल का जवाब देता है
बशूसर

चूँकि यह उर्फ ​​इको के लिए बुरा अभ्यास है (इस पर निर्भर होने वाले प्रोग्राम टूट सकते हैं) आपको
एलीस

आपके जवाब के लिए बहुत बहुत धन्यवाद, एक तरीका है कि क्या मैं उर्फ ​​के साथ अपेक्षित परिणाम प्राप्त कर सकता हूं, हालांकि यह एक अच्छा अभ्यास नहीं है
बशूसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.