PS1 के लिए टर्मिनल रंग कोड स्टोर करने के लिए चर का उपयोग करना?


33

मेरे में .bashrc, मैं विभिन्न बिट्स को रंग देने के लिए एएनएसआई टर्मिनल रंग कोड का उपयोग करता हूं। यह इस तरह दिख रहा है:

PS1='\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ '

जहां virtual_envऔर git_branchbash फ़ंक्शंस हैं जो आउटपुट सामान stdout पर हैं।

अब, इसे पढ़ना और संशोधित करना आसान बनाने के लिए, मैं सीधे कोड एम्बेड करने के बजाय, चर में रंग कोड संग्रहीत करना और उन्हें संदर्भित करना चाहूंगा PS1। तो मेरे पास इस तरह चर का एक गुच्छा है:

GREEN="\[\033[32m\]"
YELLOW="\[\033[33m\]"
RESET="\[\033[0m\]"

मैं कुछ लिखना चाहूंगा:

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

लेकिन यह काम नहीं करता है - रंग कोड संकेत में दिखाते हैं, जैसे वे बच गए हैं। यदि मैं इसके बजाय दोहरे उद्धरण चिह्नों का उपयोग करता हूं, तो रंग सही ढंग से काम करते हैं PS1, लेकिन तब संकेत केवल तब बदलता है जब मैं करता हूं source ~/.bashrc

मैं अन्य बातों मैंने देखा है लोगों की कोशिश की है - का उपयोग करते हुए printf, रंग के लिए एकल उद्धरण का उपयोग कर, डाल \[और \]में PS1रंग चर के बजाय, लेकिन कुछ भी काम करने लगता है।

मैं रंग कोड के लिए चर का उपयोग कैसे कर सकता हूं?


क्या आप हमें अपना दे सकते हैं .bashrc?
१:51:५१ पर क्यूंग्लम

@ cuonglm आपके सभी .bashrc हमारे हैं? मैं खुद को दिखाऊंगा।
CivFan

जवाबों:


20

समाधान को परिभाषित करते समय रंग चर को प्रतिस्थापित करने के लिए शेल प्राप्त करना है, लेकिन फ़ंक्शन नहीं। ऐसा करने के लिए, दोहरे उद्धरण चिह्नों का उपयोग करें जैसा कि आपने मूल रूप से कोशिश की थी, लेकिन कमांड से बच गए ताकि उनका मूल्यांकन तब तक न किया जाए जब तक कि संकेत तैयार न हो जाए।

PS1="\u@\h:\w${YELLOW}\$(virtual_env)${GREEN}\$(git_branch)${RESET}$ "

प्रत्येक कमांड पर \पहले सूचना दें $()

यदि हम इसे बाहर निकालते हैं, तो हम देखते हैं:

echo "$PS1"
\u@\h:\w\[\033[33m\]$(virtual_env)\[\033[32m\]$(git_branch)\[\033[0m\]$ 

जैसा कि आप देख सकते हैं, रंग चर को प्रतिस्थापित किया गया, लेकिन कमांड नहीं।


1
अगर $ (git_branch) $ {YELLOW} आदि का उपयोग करके प्रिंट करने की कोशिश कर रहा है, तो यह काम नहीं करता है, अकेले उस अनुभाग में, आपको अभी भी सभी [] वर्ण मिलेंगे।
डब्ल्यूबी रीड

7

समस्या यह है कि आपका चर GREEN में "बैकस्लैश ब्रैकेट बैकस्लैश ज़ीरो थ्री थ्री" से बना शाब्दिक स्ट्रिंग है। रंग बदलने के लिए अपने टर्मिनल को प्राप्त करने के लिए आवश्यक ASCII एस्केप वर्ण उदाहरण के लिए इसमें शामिल नहीं है।

आप में नियंत्रण वर्ण डाल सकता है GREEN(और YELLOWऔर RESET) मैन्युअल रूप से है, लेकिन एक बहुत अच्छा विकल्प का उपयोग करने के लिए है tputपहली जगह में इतना है कि आप हार्ड कोड कुछ भी करने की जरूरत नहीं है और आप किसी भी टर्मिनल प्रकार का समर्थन करेंगे।

GREEN="$(tput setaf 2)"
YELLOW="$(tput setaf 3)"
RESET="$(tput setaf 0)"

जब आप "बैकस्लैश ज़ीरो थ्री थ्री" इत्यादि डालते हैं तो इसका कारण दुनिया है ... सीधे तौर पर PS1यह है कि कुछ बैकस्लैश दृश्यों की व्याख्या एक विशेषता है बैश की प्रॉम्प्टिंग की है (मैनुअल में सेक्शन प्रॉम्प्टिंग देखें। पैरामीटर विस्तार, कमांड से पहले यह प्रतिस्थापन) प्रतिस्थापन, अंकगणितीय विस्तार, और उद्धरण हटाना, हालांकि, इसलिए यह उन सभी अन्य कार्यों के परिणामों पर लागू नहीं होता है।


5
इस तरह से करते समय, आपको \[\]अंदर रंग चर को लपेटने की आवश्यकता होती है $PS1। उदाहरण के लिए PS1='\u@\h:\w\[${YELLOW}\]':। यदि आप ऐसा नहीं करते हैं, और आप एक लंबी कमांड के साथ समाप्त होते हैं जो अगली पंक्ति में जाता है, तो आपको सभी प्रकार के मुद्दों का सामना करना पड़ेगा। शेल यह \[\]निर्धारित करने के लिए उपयोग करता है कि कौन से वर्ण गैर-मुद्रण योग्य हैं, इसलिए यह उन्हें त्वरित लंबाई की गणना में कारक नहीं बनाता है। इसे इसकी आवश्यकता है ताकि यह टर्मिनल चौड़ाई से अधिक होने पर लाइन को ठीक से खींच सके।
पैट्रिक

मैं tputधन्यवाद के बारे में नहीं जानता था । मैं अभी के लिए पैट्रिक के उत्तर का उपयोग करूंगा लेकिन जब मुझे मौका मिलेगा तो मैं इसे फिर से देखूंगा।
इस्माइल बदावी

2

$ GREEN, YELLOW और $ RESET भरने का तरीका बदलें:

GREEN="$(echo -e "\033[32m")"
YELLOW="$(echo -e "\033[33m")"
RESET="$(echo -e "\033[0m")"

PS1='\u@\h:\w${YELLOW}$(virtual_env)${GREEN}$(git_branch)${RESET}$ '

1
यह वास्तव में सेलाडा के जवाब के रूप में सटीक बात करता है। यदि सेलिंग रंग की सेटिंग के लिए टर्मिनल अलग-अलग एस्केप कोड का उपयोग करता है तो सेलडा अधिक पोर्टेबल है। मल्टी-लाइन प्रॉम्प्ट चीज़ के साथ भी यही समस्या है।
पैट्रिक

2
\[…\]बिट की जरूरत प्रॉम्प्ट में रहने के लिए, आप एक चर में यह सामान नहीं कर सकते। आपने इसे पूरी तरह से हटा दिया है, जिसके परिणामस्वरूप प्रदर्शन समस्याएं होंगी (कर्सर उस स्थिति में नहीं है जहां बैश को उम्मीद है)।
गिल्स एसओ- बुराई को रोकना '

@ पैट्रिक चिंताओं के अलावा, गूंज पोर्टेबल नहीं है।
हेलपरमेथोड

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