2014-07-19 10 views
5

मैं अपने बैश प्रॉम्प्ट को पॉप्युलेट करने के लिए बाहरी कमांड का उपयोग कर रहा हूं, जो प्रत्येक बार पीएस 1 का मूल्यांकन होता है। हालांकि, मुझे एक समस्या है जब यह आदेश गैर-प्रिंट करने योग्य वर्णों (जैसे रंग से बचने वाले कोड) आउटपुट करता है।बैश पीएस 1: बाहरी कमांड से गैर-प्रिंटिंग वर्णों के साथ लाइन रैप समस्या

$ cat green_cheese.sh 
#!/bin/bash 
echo -e "\033[32mcheese\033[0m" 

$ export PS1="\$(./green_cheese.sh) \$" 
cheese $ # <- cheese is green! 
cheese $ <now type really long command> 

PS1 प्रॉम्प्ट में गैर मुद्रण पात्रों के साथ काम कर के विहित तरीका उन्हें \[ और \] भागने दृश्यों में संलग्न करने के लिए है: यहाँ एक उदाहरण है।

$ cat green_cheese.sh 
#!/bin/bash 
echo -e "\[\033[32m\]cheese\[\033[0m\]" 
$ export PS1="\$(./green_cheese.sh) \$" 
\[\]cheese\[\] $ # <- FAIL! 

वहाँ एक विशेष एस्केप अनुक्रम मैं बाहरी आदेश से उपयोग कर सकते हैं वांछित परिणाम प्राप्त करने है: समस्या यह है कि अगर आप इस बाहरी आदेश से कर उन पलायन PS1 दुभाषिया द्वारा पार्स नहीं किया जाता है? या क्या कोई तरीका है कि मैं मैन्युअल रूप से प्रॉम्प्ट बता सकता हूं कि त्वरित चौड़ाई को सेट करने के लिए कितने वर्ण हैं?

मान लें कि मैं बाहरी कमांड से कुछ भी पसंद कर सकता हूं, और यह आदेश काफी बुद्धिमान हो सकता है (उदाहरण के लिए, आउटपुट में वर्णों की गणना करना)। मैं आवश्यकतानुसार export PS1=... कमांड भी बना सकता हूं। हालांकि, रंगों के लिए बचने के कोड बाहरी कमांड से आना चाहिए।

अग्रिम धन्यवाद!

उत्तर

11

मैं तुम्हें वास्तव में बता कारण नहीं जान सके इस काम करता है, लेकिन \[ और \] वास्तविक अक्षर हैं जो bash अपने प्रॉम्प्ट में उन लोगों से उत्पन्न करता है के साथ बदलें:

echo -e "\001\033[32m\002cheese\001\033[0m\002" 

[मैं कुछ स्टैक ओवरफ़्लो से यह सीखा पोस्ट कि मैं अब नहीं मिल रहा।]

तो मुझे लगता है कि करने के लिए किया था, यह उस bash की जगह \[ और \] दो ASCII वर्ण के साथ आदेश है कि जनसंपर्क में एम्बेड किया गया है निष्पादित करने से पहले है ompt, ताकि green_cheese.sh पूरा हो जाए, रैपर को सही तरीके से संसाधित करने के लिए bash के लिए बहुत देर हो चुकी है, और इसलिए उनका शाब्दिक व्यवहार किया जाता है। PS1 के मान में निष्पादन योग्य कोड एम्बेड करने के बजाय, अपने त्वरित गतिशील रूप से निर्माण करने के लिए PROMPT_COMMAND का उपयोग करने का एक तरीका है।

prompt_cmd() { 
    PS1="$(green_cheese.sh)" 
    PS1+=' \$ ' 
} 

PROMPT_COMMAND=prompt_cmd 

इस तरह, \[ और \]PS1 लिए जोड़ रहे हैं जब यह परिभाषित है, नहीं है जब यह का मूल्यांकन है, तो आप सीधे \001 और \002 उपयोग करने की आवश्यकता नहीं है।

+0

धन्यवाद। यह पूरी तरह से काम करता है! असल में, अब मैं उपयोग करने के लिए बचने वाले कोडों को जानता हूं, मुझे आपके द्वारा संदर्भित अन्य पोस्ट मिलती हैं: http://stackoverflow.com/a/22706988/341459 http://stackoverflow.com/a/14637194/341459 http://stackoverflow.com/a/19501528/341459 –

+2

आप पूरी तरह से सही हैं। '001' और' \ 002', उर्फ ​​आरएल_PROMPT_START_IGNORE और RL_PROMPT_END_IGNORE, एक खराब दस्तावेज [रीडलाइन सुविधा] हैं (http://git.savannah.gnu.org/cgit/readline.git/tree/display.c?id= fb914b20839322c962918590b3ea449555d7d9f9 # n262)। बैश '\ [.. \] 'से' 001 .. \ 002' को रीडलाइन के रूप में परिवर्तित करता है, लेकिन मौजूदा लोगों से बचने के लिए उपेक्षा करता है ताकि यह कार्यान्वयन विस्तार (और यह इतना उपयोगी हो कि आप इसे शायद ही कभी एक बग कह सकें)। –

+0

जब मैंने हालिया पोस्ट पर 'PROMPT_COMMAND' देखा था तो मुझे यह प्रश्न याद आया और यह वापस चला गया लेकिन ऐसा लगता है कि विचार पहले से ही दिया गया था। मुझे यह भी विचार था कि बैश वास्तव में '\ [' और '\]' के वर्णों का उत्पादन कर रहा है और इसे जांचने की कोशिश की लेकिन 'ttyrec' का आउटपुट सिर्फ भ्रमित था इसलिए मैंने अभी छोड़ दिया। +1 बीटीडब्ल्यू – konsolebox

-1

मुझे संदेह है कि यदि आप अपने पहले उदाहरण के बाद $PS1 के मान को प्रतिबिंबित करते हैं, तो आप पाएंगे कि इसका मान हरे रंग में "पनीर" शब्द है। (कम से कम, जब मैं आपका उदाहरण चलाता हूं तो मैं यही देखता हूं।) पहली नज़र में, यह वही है जो आप चाहते हैं - शब्द "पनीर" हरे रंग में! सिवाय इसके कि आप वास्तव में शब्द पनीर शब्द से बचने वाले शब्द से पहले हरे रंग का था। इको के लिए -e ध्वज का उपयोग करके आपने क्या किया है, बचने वाले कोड के साथ मूल्य का मूल्यांकन पहले से ही का मूल्यांकन किया गया है।

कि होता रंग की विनिर्देश के लिए काम करने के लिए है, लेकिन जैसा कि आप मिल गया है, यह कुछ $PS1 दुभाषिया ठीक से समझ नहीं है में "गैर मुद्रण अनुक्रम" मार्कर mangles।

सौभाग्य से, समाधान सरल है: -e ध्वज ड्रॉप करें। echo तब अनचाहे दृश्यों को छोड़ देगा, और $PS1 दुभाषिया सही चीज करेगा।

+0

निष्पक्ष लगता है, काम नहीं करता है। चेपनेर ने पहले ही वर्णन किया है कि बाहरी कमांड कहलाए जाने से पहले * कैसे बच निकलता है। – Blauhirn

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