क्या टर्मिनल कलर एस्केप सीक्वेंस को बैश के लिए कहीं भी परिभाषित किया गया है?


22

मैंने बैश स्क्रिप्टिंग में हर बार अक्सर रंगों का इस्तेमाल किया है (ज्यादातर सेंटो पर), लेकिन उनके उपयोग को और अधिक आश्वस्त करने के लिए मैं रंग मूल्यों के लिए चर को फिर से परिभाषित कर रहा हूं :

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

या इसके साथ भी tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

मैंने /etc/rc.d/init.dनिर्देशिका के चारों ओर grep'ed किया है, लेकिन वहां रंग परिभाषा से संबंधित कुछ भी नहीं मिला है।

क्या ऐसी परिभाषा पहले से है? यदि नहीं, तो मैं उन्हें /etc/rc.d/init.dकहने के लिए एक फ़ाइल में डालूँगा, और यह मेरी स्क्रिप्ट में शामिल है, थोड़ा सा साथ में/etc/rc.d/init.d/functions


वे नहीं हैं, क्योंकि \e[1;30m, उदाहरण के लिए, तकनीकी रूप से ग्रे का प्रतिनिधित्व नहीं करता है, बल्कि रंग स्लॉट आमतौर पर एक टर्मिनल द्वारा ग्रे के रूप में प्रदर्शित किया जाता है। टर्मिनल एमुलेटर वास्तविक प्रदर्शन रंग बदलने के लिए स्वतंत्र हैं, और अक्सर उन्हें एक उपयोगकर्ता-विन्यास विकल्प बनाते हैं।
शेपनर

जवाबों:


36

आप जो पूछ रहे हैं, उसमें खेलने के कई पहलू हैं।

सबसे पहले, bash रंगों को परिभाषित नहीं करता है। वास्तव में बैश बिल्कुल पता नहीं है कि रंग भी मौजूद हैं। यह सब जानता है कि आपने इसे पात्रों को आउटपुट करने के लिए कहा था \033[0;36m। आपका टर्मिनल एमुलेटर (xterm, सूक्ति-टर्मिनल, जो भी हो) इन पात्रों को प्राप्त करता है और समझता है "मुझे सियान में आउटपुट शुरू करने की आवश्यकता है"।

इस प्रकार यह आपका टर्मिनल एमुलेटर है जो रंगों को समझता है। आपका टर्मिनल एमुलेटर समझता है कि \033[0;36mसियान है, लेकिन एक अन्य टर्मिनल एमुलेटर सियान के लिए वर्णों के एक पूरी तरह से अलग सेट का उपयोग कर सकता है (हालांकि कोई भी सेनानी टर्मिनल एमुलेटर मानक को अलग नहीं करेगा और ऐसा करेगा)। इसका कारण है tput। जब आप दौड़ते हैं tput setaf 6, tputतो रंग 6 (cyan) के लिए अपने टर्मिनल के एस्केप कोड और आउटपुट से बचने वाले कोड को देखने जा रहे हैं।
( कोड पर अधिक जानकारी के लिए यह प्रश्न देखें tput setaf)

अब वापस बैश करने के लिए। जैसा कि आपने देखा होगा, जब मैं सियान रंग की बात कर रहा हूं, मैं उपयोग कर रहा हूं \033[0;36m, नहीं \[\033[0;36m\]। वर्गाकार कोष्ठक गायब हो चुके हैं। चौकोर कोष्ठकों का उद्देश्य यह है कि प्रॉम्प्ट में एस्केप कोड (रंगों) का उपयोग करते समय, बैश को यह जानना होगा कि कौन से वर्ण गैर-मुद्रण हैं (शून्य-चौड़ाई, वास्तव में कुछ भी नहीं दिखाते हैं)। इस प्रकार आप गैर-मुद्रण वर्णों को संलग्न करते हैं \[ \]। यदि आप इन वर्णों को हटाते हैं, तो सब कुछ पहले ठीक काम करने के लिए प्रकट हो सकता है, लेकिन जब आपकी कमांड टर्मिनल की चौड़ाई से अधिक हो जाएगी, तो आप सभी प्रकार की विचित्रताओं में भागना शुरू कर देंगे। ऐसा इसलिए है क्योंकि टाइप करते समय, बैश को यह जानना होता है कि कमांड को अगली पंक्ति में कब लपेटना चाहिए। ऐसा करने के लिए, यह प्रॉम्प्ट की चौड़ाई की गणना करता है, और फिर आपने कितनी टाइप की है।

एक और नोट, के बारे में tputCYAN="\[\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\]"

Ctrl+ Alt+ के साथ एक वास्तविक टर्मिनल में प्रवेश करते समय मैं रंग कैसे देख सकता हूं F1?
सर्ज स्ट्रोबोबांट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.