गिल्स ने आपकी मुख्य समस्या की पहचान की, लेकिन मैं इसे अलग तरीके से समझाने की कोशिश करना चाहता था।
बैश प्रॉम्प्ट में किसी भी चर का विस्तार करने से पहले केवल विशेष प्रॉम्प्ट से बच जाता है । इसका मतलब यह है कि \e
प्रॉम्प्ट से विस्तारित एक चर का उपयोग करना काम नहीं करता है, भले ही यह सीधे काम करता है PS1
।
उदाहरण के लिए, यह उम्मीद के अनुसार काम करता है, और लाल पाठ देता है:
PS1='\e[1;31m this is in red '
लेकिन यह नहीं है, यह सिर्फ शीघ्र में एक शाब्दिक डालता है \e
:
RED='\e[1;31m'
PS1="$RED not in red "
यदि आप चर में रंग से $'...'
बचना चाहते हैं, तो आप एएनएसआई-सी का उपयोग कर सकते हैं ( ) को चर में एक शाब्दिक बच चरित्र डाल सकते हैं।
ऐसा करने के लिए, आप की अपनी परिभाषा को बदल सकते हैं GREEN
, RED
और NONE
, इसलिए उनके मूल्य वास्तविक भागने अनुक्रम है।
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
यदि आप ऐसा करते हैं, PS1
तो एकल उद्धरण के साथ आपका पहला काम होना चाहिए:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
हालाँकि, तब आपको दूसरी समस्या होगी।
उसे चलाने का प्रयास करें, फिर दबाएं Up Arrow, फिर Home, और आपका कर्सर लाइन की शुरुआत में वापस नहीं जाएगा।
इसे ठीक करने के लिए, रंग से बचने के दृश्यों PS1
को शामिल करने \[
और \]
उसके आसपास बदलने के लिए , जैसे
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
आप get_exit_status
यहां ठीक से उपयोग नहीं कर सकते , क्योंकि इसके आउटपुट में प्रिंटिंग (एग्जिट कोड) और नॉन-प्रिंटिंग कैरेक्टर (कलर कोड) दोनों शामिल हैं, और प्रॉम्प्ट में इसे सही तरीके से चिह्नित करने का कोई तरीका नहीं है। पुटिंग \[...\]
इसे पूर्ण रूप से गैर-मुद्रण के रूप में चिह्नित करेगी, जो सही नहीं है। आपको फ़ंक्शन बदलना होगा ताकि यह केवल उचित रंग-कोड को प्रिंट करे, और फिर इसे \[...\]
प्रॉम्प्ट से घेर ले ।
\[
है\1
, और\[
है\2
। वे कुछ रीडलाइन कीRL_PROMPT_{START,END}_IGNORE
चीज़ से मेल खाते हैं जो स्क्रीन पर शीघ्र लंबाई की गिनती करते समय बाइट्स को अनदेखा करने के लिए कहता है। Lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html देखें ।