शेल स्क्रिप्ट में "दोस्ताना" टर्मिनल रंग के नाम?


25

मुझे रूबी और जावास्क्रिप्ट जैसी भाषाओं में पुस्तकालयों के बारे में पता है, ताकि "लाल" जैसे रंग नामों का उपयोग करके अपनी टर्मिनल लिपियों को आसान बनाया जा सके।

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


8
कृपया एक उत्तर को सही के रूप में चिह्नित करें ... आपने अब तक अपने कुल 46 प्रश्नों में से 1 को चिह्नित किया है!
m13r

जवाबों:


39

आप अपनी बैश लिपियों में रंगों को इस तरह परिभाषित कर सकते हैं:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

और फिर उन्हें अपने आवश्यक रंगों में प्रिंट करने के लिए उपयोग करें:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."

11

आप tput OR का उपयोग कर सकते हैंprintf

का उपयोग कर tput,

बस नीचे के रूप में फ़ंक्शन बनाएँ और उनका उपयोग करें

shw_grey () {
    echo $(tput bold)$(tput setaf 0) $@ $(tput sgr 0)
}

shw_norm () {
    echo $(tput bold)$(tput setaf 9) $@ $(tput sgr 0)
}

shw_info () {
    echo $(tput bold)$(tput setaf 4) $@ $(tput sgr 0)
}

shw_warn () {
    echo $(tput bold)$(tput setaf 2) $@ $(tput sgr 0)
}
shw_err ()  {
    echo $(tput bold)$(tput setaf 1) $@ $(tput sgr 0)
}

आप फ़ंक्शन का उपयोग करके ऊपर कॉल कर सकते हैं shw_err "WARNING:: Error bla bla"

का उपयोग करते हुए printf

print red; echo -e "\e[31mfoo\e[m"

2
echo -eनहीं है printf, और यह भी एक चेतावनी की जरूरत है कि यह tputविकल्प से अलग है कि यह स्वचालित रूप से सूट के लिए अनुकूल नहीं है $TERM
टोबे स्पाइट


4

सरल आम उपयोगों के लिए (केवल एक रंग में पाठ की पूरी पंक्ति, अनुगामी न्यूलाइन के साथ) मैंने जस्वोनरीयन के कोड को संशोधित किया है:

#!/bin/bash

red='\e[1;31m%s\e[0m\n'
green='\e[1;32m%s\e[0m\n'
yellow='\e[1;33m%s\e[0m\n'
blue='\e[1;34m%s\e[0m\n'
magenta='\e[1;35m%s\e[0m\n'
cyan='\e[1;36m%s\e[0m\n'

printf "$green"   "This is a test in green"
printf "$red"     "This is a test in red"
printf "$yellow"  "This is a test in yellow"
printf "$blue"    "This is a test in blue"
printf "$magenta" "This is a test in magenta"
printf "$cyan"    "This is a test in cyan"

या अक्क में, थोड़ा संशोधित:awk -v red="$(printf '\e[1;31m%%s\e[0m\\n')" -v green="$(printf '\e[1;32m%%s\e[0m\\n')" 'BEGIN { printf red, "This text is in red"; printf green, "This text is in green" }'
वाइल्डकार्ड

3

बेहतर उपयोग करने के लिए है tputजो आउटपुट / टर्मिनल क्षमताओं के आधार पर भागने वाले पात्रों को संभालेंगे। (यदि कोई टर्मिनल \e[*रंग कोड की व्याख्या नहीं कर सकता है , तो यह "प्रदूषित" होगा जो आउटपुट को पढ़ने के लिए कठिन बना देता है। (या कभी-कभी, यदि आप grepऐसे आउटपुट करते हैं, तो आप उन \e[*परिणामों को देखेंगे )

इस ट्यूटोरियल कोtput देखें ।

तुम लिख सकते हो :

blue=$( tput setaf 4 ) ;
normal=$( tput sgr0 ) ;
echo "hello ${blue}blue world${normal}" ;

यहां टर्मिनल में रंगीन घड़ी प्रिंट करने के लिए एक ट्यूटोरियल है।

इसके अलावा, ध्यान दें कि tputफ़ाइल से STDOUT को रीडायरेक्ट करने पर अभी भी वर्ण से बच सकता है:

$ myColoredScript.sh > output.log ;
# Problem: output.log will contain things like "^[(B^[[m"

ऐसा होने से रोकने के लिए, इस समाधानtput में प्रस्तावित अपने चरों को सेटअप करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.