मैं एनी एस्केप सीक्वेंस का उपयोग करके अपने xterm के रंग कैसे बदल सकता हूं?


25

मैं अपने xterm के रंग (पृष्ठभूमि, फ़ॉन्ट, अग्रभूमि) को कमांडलाइन से बदलना चाहूंगा। मैंने सुना है कि यह एएनएसआई से बच दृश्यों का उपयोग करके किया जा सकता है।

यदि यह संभव है:

  • यह कैसे किया जाता है?
  • क्या मैं रंग नामों का उपयोग कर सकता हूं या मुझे उनके RGB कोड्स का उपयोग करना चाहिए?

जवाबों:


27

एएनएसआई से बचने के क्रम में वर्णों के अनुक्रम से बना होता है, जो चरित्र से बचता है, चरित्र 27। अगला चरित्र अक्सर (हालांकि हमेशा नहीं) एक खुला-वर्ग-ब्रैकेट होता है: [

यदि आप निर्दिष्ट करते हैं -eऔर \eभागने के लिए उपयोग करते हैं तो इको कमांड एस्केप कैरेक्टर भेज सकता है।

ANSI मानक 8 रंगों को परिभाषित करता है, साथ ही एक उज्ज्वल मोड, कुल 16 स्थिति देता है। अनुक्रम है:

\e[<number>m

जहाँ <number>एक है:

अग्रभूमि:

  • 30 काला
  • 31 लाल
  • 32 हरा
  • 33 पीला
  • 34 नीला
  • 35 मैजेंटा
  • 36 सियान
  • ३ White श्वेत

पृष्ठभूमि:

  • 40 काला
  • ४१ लाल
  • ४२ हरा
  • 43 पीला
  • ४४ नीला
  • 45 मैजेंटा
  • 46 सियान
  • 47 सफेद

  • 0 सभी को रीसेट करें

  • 1 बोल्ड

तो अपने अग्रभूमि को लाल और अपनी पृष्ठभूमि को पीला बनाने के लिए:

$ echo -e "\e[31m\e[43m"

और बोल्ड को सक्षम करने के लिए:

$ echo -e "\e[1m"

बेशक, आप उन सभी को एक साथ जोड़ सकते हैं:

$ echo -e "\e[31m\e[43m\e[1m"

अन्य काम करने के लिए कई अन्य भागने के कोड हैं।

उदाहरण के लिए - स्क्रीन को साफ़ करें और कर्सर को ऊपर-बाईं ओर ले जाएँ:

$ echo -e "\e[2J\e[1;1H"

रंग बदलते समय जो उपयोगी है:

$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"

जो रंगों को बदल देगा, स्क्रीन को साफ करेगा, और कर्सर को सबसे ऊपर बाईं ओर रखेगा। खैर, लगभग शीर्ष छोड़ दिया। इको एक गाड़ी को वापस अंदर डालता है, इसलिए यह एक रेखा से नीचे चला जाता है। -nयदि आप उधम मचाते हैं तो आप इसे रोकने के लिए प्रतिध्वनि जोड़ सकते हैं ।

यदि आप इसे गड़बड़ करते हैं और यह नहीं देख सकते हैं कि आप जो टाइप कर रहे हैं उसे दबाकर आप टर्मिनल रंगों को सामान्य कर सकते हैं:

Ctrl+v [ 0 m Return

आप क्या उम्मीद पर कमांड प्रॉम्प्ट है। यह एक अज्ञात कमांड के बारे में फुसफुसाएगी, लेकिन आप यह देख पाएंगे कि आप फिर से क्या कर रहे हैं।


क्या मैं रंग कोड के बजाय रंग नामों का उपयोग कर सकता हूं?
नाथन फेलमैन

1
नहीं, लेकिन आप चर को रंग कोड असाइन कर सकते हैं। FGRED = 31; echo -e "\ e [$ {FGRED} m"
माजेंको

3
हालांकि, यह ध्यान दिया जाना चाहिए कि कई रंग कोड नंबर ";" द्वारा अलग किए जा सकते हैं। तो अपने अग्रभूमि को लाल और अपनी पृष्ठभूमि को पीला बनाने के लिए आप छोटे का भी उपयोग कर सकते हैं: echo -ne '\e[31;43m'(ऊपर के बजाय echo -e "\e[31m\e[43m")।
एंड्रियास स्पिंडलर

मैं कर्सर का रंग 34 ब्लू में कैसे बदल सकता हूं?
त्रिकुट्र

28

ध्यान दें कि आधुनिक Xterms 32-बिट रंग का समर्थन करते हैं!

सरल उदाहरण है। # 53186f मान के लिए एक अच्छा गहरा बैंगनी बैकग्राउंड (हे, प्रत्येक के अपने) सेट करने के लिए, आप यह करें:

echo -ne "\033]11;#53186f\007"

ध्यान दें कि यह तुरंत पूरी खिड़की का रंग बदलता है, न कि बाद के पाठ का। यह एक सर्वर (उदाहरण के लिए) के लिए ssh'ing के बाद स्पष्ट रूप से अलग एक खिड़की बनाने के लिए अच्छा है। उपरोक्त 'गूंज' को अपने .bashrc में रखें और जब आप उस सर्वर में लॉग इन करते हैं तो आपका टर्मिनल स्वचालित रूप से रंग बदल देता है (लेकिन जब आप Ctrl-D बाहर निकालेंगे तो यह वापस नहीं बदलेगा)

आप इसके लिए नेट पर HOURS खर्च कर सकते हैं - अधिकांश डॉक्स केवल मूल 16 ANSI रंगों के बारे में बात करते हैं।

स्रोत: http://www.steike.com/code/xterm-colors/ और http://rtfm.etla.org/xterm/ctlseq.html ("ऑपरेटिंग सिस्टम नियंत्रण" के तहत देखें)

कृपया ध्यान दें: ऊपर दिया गया पलायन क्रम XTerms के लिए मान्य है, और "XTerm-like" विंडो टर्मिनल एमुलेटर के अन्य कार्यान्वयन के लिए काम नहीं कर सकता है जो XTerm की तरह "दिखना" हो सकता है। उदाहरण के लिए, "सूक्ति-टर्मिनल" या "कोनोसोल" में अलग-अलग एस्केप सीक्वेंस हैं, या रंग परिवर्तन को बिल्कुल भी लागू नहीं कर सकते हैं।


1
यह मेरे लिए काम नहीं कर रहा है, यह टर्मिनल में कोई अवलोकन परिवर्तन के साथ एक खाली लाइन इकोस करता है।
रिचर्ड

1
यह मेरे लिए काम करता था, जबकि अन्य नहीं करते थे - बहुत मददगार, thx
vol7ron

1
+1 खिड़की की पृष्ठभूमि को बदलता है, और "# 00ff00" के बजाय "हरा" जैसे रंग नामों की अनुमति देता है।
रोब I

1
कैसा है # 53186f 32-बिट रंग। मैं 24 बिट गिनता हूं ...
जिगगंज

क्या किसी को पता है कि गनोम-टर्मिनल के साथ एक ही चीज़ को कैसे पूरा किया जाता है?
wjandrea

3

हाँ। ANSI टर्मिनल ANSI एस्केप कोड का समर्थन करते हैं । प्रत्येक Control Sequence Introducer( CSI) निम्नलिखित प्रारूप में कोड:

ESC[<<<CODE>>>

एस्की चरित्र 27( ESCचरित्र) या 1bहेक्साडेसिमल में, उसके बाद एक बाएं वर्ग कोष्ठक, और फिर एक पत्र जिसका उपयोग करने के लिए कार्रवाई को दर्शाती है।

ध्यान दें कि ;अलग मापदंडों की एक सूची सीधे <<<CODE>>>पैरामीटर से पहले आपूर्ति की जा सकती है ।

अब, रंग CSIकोड के एक सबसेट का उपयोग करते हैं , Select Graphic Renditionकोड। ये फॉर्म में हैं:

ESC[<<<SGR>>>m

SGRकोड एक पैरामीटर के रूप पारित कर दिया है CSI। आपके प्रश्न के लिए प्रासंगिक SGRकोड 30-49 हैं। कोड 30-39 अग्रभूमि रंग निर्धारित करते हैं। कोड 40-49 पृष्ठभूमि रंग निर्धारित करते हैं।

30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White

40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White

कोड 38 और 48 विशेष कोड हैं। ये वे हैं जो आपको RGB मान का उपयोग करने की अनुमति देते हैं। इनके लिए प्रारूप यह है:

ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)

नोट: वैकल्पिक उपयोगों में शामिल हैं \x1b[<3 or 4>8;5;<web safe color index>m। इस उपयोग के साथ, एक पूरी तरह से अलग रंग एन्कोडिंग है। अधिक जानकारी के लिए इस उत्तर के शीर्ष पर स्थित लिंक देखें।

कोड 39 और 49 ने अपनी चूक के लिए अग्रभूमि और पृष्ठभूमि रंग निर्धारित किए हैं, जो टर्मिनल-दर-टर्मिनल आधार पर परिभाषित किए गए हैं।

व्यवहार में, रंग 30-37 40-47 उनके लेबल जो कहते हैं, उससे थोड़ा अलग हैं।

0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey

हल्के रंग प्राप्त करने के लिए, आप बोल्ड के लिए SGI का उपयोग करें 1। बोल्ड एक भ्रामक नाम है। यह फॉन्ट को बोल्ड नहीं बनाता है। यह वास्तव में पाठ की चमक को बढ़ाता है। बोल्ड लागू रंगों के साथ:

0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White

सूचना: रंगों की संख्या के अंतिम दो खंड दोनों- और पृष्ठभूमि ( <index> + (30 or 40)) के लिए प्रासंगिक हैं ।

सभी शैलियों को हटाने के लिए (डिफ़ॉल्ट / सामान्य मोड पर वापस) SGR0 का उपयोग करें ।

CSIकोड सभी ग्राफिकल नहीं हैं। उदाहरण के लिए, ESC[2Jअपना टर्मिनल खाली कर देगा। ESC[<y>;<x>Hकर्सर स्थिति (1-अनुक्रमित) सेट करता है। अधिक जानकारी के लिए विकिपीडिया लेख देखें।

नोट: इनका परीक्षण करने के लिए, का उपयोग करें echo -eया printf


2

नोट: "^ [" बच चरित्र है, और CTRL-V, CTRL- [, और ^ G के साथ एक घंटी वर्ण डाला जाता है, CTRL-V, CTRL-G के साथ डाला जाता है

निम्नलिखित ब्लॉक मेरे .bash_profile में है और यह सुनिश्चित करता है कि इस प्रणाली पर मेरे xterms हमेशा-पर-काले हैं, फिर भी किसी अन्य सिस्टम पर लॉग इन करने के बाद जो मेरे रंग बदल सकते हैं।

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '

0

यह भी एक परियोजना की जाँच ScriptEchoColor
यह पूरी तरह से पार्टी लिपियों में किया जाता है
यह ubuntu के लिए संकुल है यहाँ
लेकिन ये स्क्रिप्ट किसी भी distro पर स्थापित किया जा सकता है, तो आप को पता है (नवीनतम इसके Git से भी डाउनलोड किया जा सकता) कैसे।

आप जैसे छोटे या विस्तारित रंग नामों का उपयोग कर सकते हैं:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

एक नमुना: यहाँ छवि विवरण दर्ज करें

इसके अलावा, xtermcontrol पर एक नज़र रखना सुनिश्चित करें , अपने आप पर xterm पर अधिक व्यापक नियंत्रण के लिए (न केवल अक्षर)।


0

कई एएनएसआई सीएसआई कोडों में से एक एसजीआर, या सिलेक्ट ग्राफिक रेंडिशन कहा जाता है। यह ईएससी, [पैरामीटर, पैरामीटर है, mजहां एएससीआईआई प्रारूप में पैरामीटर एक या एक से अधिक पूर्णांक हैं, अर्धविराम द्वारा अलग किए गए हैं। कई अलग-अलग SGR पैरामीटर ऊपर विकिपीडिया पृष्ठ पर सूचीबद्ध हैं (हालांकि यह उन सभी के लिए पूर्ण विवरण में नहीं जाता है)।

जैसे कुछ मानकों, 1(बोल्ड या वृद्धि तीव्रता) और 31(लाल पाठ) स्टैंड-अलोन हैं, और के रूप में व्यक्तिगत रूप से इस्तेमाल किया जा सकता है या संयुक्त, ESC[31mया ESC[1;31mमानक लाल और बोल्ड लाल अग्रभूमि पाठ क्रमश: देने के लिए।

अन्य स्वयं पैरामीटर लेते हैं, जो कोड के बाद अधिक अर्धविराम से अलग संख्या के रूप में प्रदान किए जाते हैं। इसलिए, उदाहरण के लिए, ESC[38;5;219mविस्तारित रंग संख्या 219 में अग्रभूमि पाठ प्रदर्शित करेगा, और ESC[38;2;150;100;50mइसे RGB मूल्य 150, 100, 50 के साथ रंग में प्रदर्शित करेगा। इस मामले में, 38"विस्तारित सेट अग्रभूमि रंग" कमांड है, जिसे हमेशा follwed किया जाता है। एक उपकमांड। Subcommand 2लाल, हरे और नीले रंग के घटकों के तीन मापदंडों को लेता है। अलग-अलग, सबकुंड 5केवल एक और मूल्य लेता है, 0 से 255 तक की संख्या एक तालिका से रंग निर्दिष्ट करने के लिए जिसे टर्मिनल के साथ कॉन्फ़िगर किया गया है।

निम्नलिखित शेल फ़ंक्शन इन कोड का उपयोग करने के लिए आसान हो सकता है:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

आप इसे इस तरह से उपयोग कर सकते हैं:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

ध्यान दें कि यदि आप इसके लिए कोई पैरामीटर नहीं देते हैं तो sgr()SGR कोड 0 में चूक हो सकती है, जिसका अर्थ है कि उस टर्मिनल के लिए जो भी डिफ़ॉल्ट है, उसे टेक्स्ट रीसेट करना।


1
तकनीकी रूप से वे ESC[38... mऔर ESC[38... m/ कर सकते हैं / आपकी जानकारी के स्रोत पर निर्भर करता है - अंतिम एक, मेरा मानना ​​है कि, itu.int/rec/T-REC-T.416-199303-I ) का उपयोग करना चाहिए, अन्यथा आरक्षित, चरित्र :( पैरामीटर तत्वों को अलग करने के लिए ) ताकि ;केवल पूर्ण पैरामीटर स्ट्रिंग्स के बीच उपयोग किया जाए - यानी ESC[38;2;150;100;50mलिखा जाना चाहिए ESC[38:2::150:100:50m...
20

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