ชื่อสีขั้ว "เป็นมิตร" ในเชลล์สคริปต์?


25

ฉันรับรู้ถึงห้องสมุดในภาษาต่างๆเช่น Ruby และ Javascript เพื่อทำให้ colorizing script terminal ของคุณง่ายขึ้นโดยใช้ชื่อสีเช่น "red"

แต่มีบางอย่างเช่นนี้สำหรับเชลล์สคริปต์ใน Bash หรือ Ksh หรืออะไรก็ตาม?


8
โปรดทำเครื่องหมายคำตอบว่าถูกต้อง ... คุณทำเครื่องหมายเพียง 1 จากทั้งหมด 46 ข้อที่ยังไม่ได้ถาม!
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 หรือ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
Toby Speight


4

สำหรับการใช้งานทั่วไปอย่างง่าย (ข้อความเต็มบรรทัดในสีเดียวเท่านั้นพร้อมการขึ้นบรรทัดใหม่) ฉันแก้ไขโค้ดของ jasonwryanดังนี้:

#!/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 แก้ไขเล็กน้อย: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" }'
Wildcard

3

ดีกว่าคือการใช้tputซึ่งจะจัดการอักขระ escape ขึ้นอยู่กับความสามารถของเอาต์พุต / เทอร์มินัล (หากเทอร์มินัลไม่สามารถตีความ\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ตัวแปรของคุณตามที่เสนอในโซลูชันนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.