आप जो पूछ रहे हैं, उसमें खेलने के कई पहलू हैं।
सबसे पहले, bash रंगों को परिभाषित नहीं करता है। वास्तव में बैश बिल्कुल पता नहीं है कि रंग भी मौजूद हैं। यह सब जानता है कि आपने इसे पात्रों को आउटपुट करने के लिए कहा था \033[0;36m
। आपका टर्मिनल एमुलेटर (xterm, सूक्ति-टर्मिनल, जो भी हो) इन पात्रों को प्राप्त करता है और समझता है "मुझे सियान में आउटपुट शुरू करने की आवश्यकता है"।
इस प्रकार यह आपका टर्मिनल एमुलेटर है जो रंगों को समझता है। आपका टर्मिनल एमुलेटर समझता है कि \033[0;36m
सियान है, लेकिन एक अन्य टर्मिनल एमुलेटर सियान के लिए वर्णों के एक पूरी तरह से अलग सेट का उपयोग कर सकता है (हालांकि कोई भी सेनानी टर्मिनल एमुलेटर मानक को अलग नहीं करेगा और ऐसा करेगा)। इसका कारण है tput
। जब आप दौड़ते हैं tput setaf 6
, tput
तो रंग 6 (cyan) के लिए अपने टर्मिनल के एस्केप कोड और आउटपुट से बचने वाले कोड को देखने जा रहे हैं।
( कोड पर अधिक जानकारी के लिए यह प्रश्न देखें tput setaf
)
अब वापस बैश करने के लिए। जैसा कि आपने देखा होगा, जब मैं सियान रंग की बात कर रहा हूं, मैं उपयोग कर रहा हूं \033[0;36m
, नहीं \[\033[0;36m\]
। वर्गाकार कोष्ठक गायब हो चुके हैं। चौकोर कोष्ठकों का उद्देश्य यह है कि प्रॉम्प्ट में एस्केप कोड (रंगों) का उपयोग करते समय, बैश को यह जानना होगा कि कौन से वर्ण गैर-मुद्रण हैं (शून्य-चौड़ाई, वास्तव में कुछ भी नहीं दिखाते हैं)। इस प्रकार आप गैर-मुद्रण वर्णों को संलग्न करते हैं \[
\]
। यदि आप इन वर्णों को हटाते हैं, तो सब कुछ पहले ठीक काम करने के लिए प्रकट हो सकता है, लेकिन जब आपकी कमांड टर्मिनल की चौड़ाई से अधिक हो जाएगी, तो आप सभी प्रकार की विचित्रताओं में भागना शुरू कर देंगे। ऐसा इसलिए है क्योंकि टाइप करते समय, बैश को यह जानना होता है कि कमांड को अगली पंक्ति में कब लपेटना चाहिए। ऐसा करने के लिए, यह प्रॉम्प्ट की चौड़ाई की गणना करता है, और फिर आपने कितनी टाइप की है।
एक और नोट, के बारे में tput
। CYAN="\[\033[0;36m\]"
है नहीं के रूप में एक ही बात CYAN="$(tput setaf 6)"
। जैसा कि हमने अभी चर्चा की है, चौकोर कोष्ठक बैश करने के लिए प्रासंगिक हैं, और tput
केवल टर्मिनल एस्केप कोड को आउटपुट करने जा रहा है।
चूंकि वर्ग ब्रैकेट आमतौर पर केवल प्रॉम्प्ट में प्रासंगिक होते हैं, यदि आप किसी स्क्रिप्ट या किसी चीज़ के आउटपुट में रंगों का उपयोग कर रहे हैं, तो आपको उनका उपयोग नहीं करना चाहिए। मतलब कि अगर आप संकेतों से अधिक रंगों का उपयोग करने जा रहे हैं, तो आपको कई चर को परिभाषित करने की आवश्यकता है। प्रॉम्प्ट में उपयोग करने के लिए वर्ग कोष्ठक के साथ एक, और बाकी सब के लिए एक बिना। हालाँकि आप हर बार जब आप प्रॉम्प्ट में एक रंग का संदर्भ देते हैं तो आप हर बार स्क्वायर ब्रैकेट्स को मैन्युअल रूप से जोड़ सकते हैं।
इतनी लंबी कहानी छोटी, आप शायद कुछ इस तरह परिभाषित करना चाहते हैं:
local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
\e[1;30m
, उदाहरण के लिए, तकनीकी रूप से ग्रे का प्रतिनिधित्व नहीं करता है, बल्कि रंग स्लॉट आमतौर पर एक टर्मिनल द्वारा ग्रे के रूप में प्रदर्शित किया जाता है। टर्मिनल एमुलेटर वास्तविक प्रदर्शन रंग बदलने के लिए स्वतंत्र हैं, और अक्सर उन्हें एक उपयोगकर्ता-विन्यास विकल्प बनाते हैं।