ฉันรับรู้ถึงห้องสมุดในภาษาต่างๆเช่น Ruby และ Javascript เพื่อทำให้ colorizing script terminal ของคุณง่ายขึ้นโดยใช้ชื่อสีเช่น "red"
แต่มีบางอย่างเช่นนี้สำหรับเชลล์สคริปต์ใน Bash หรือ Ksh หรืออะไรก็ตาม?
ฉันรับรู้ถึงห้องสมุดในภาษาต่างๆเช่น Ruby และ Javascript เพื่อทำให้ colorizing script terminal ของคุณง่ายขึ้นโดยใช้ชื่อสีเช่น "red"
แต่มีบางอย่างเช่นนี้สำหรับเชลล์สคริปต์ใน Bash หรือ Ksh หรืออะไรก็ตาม?
คำตอบ:
คุณสามารถกำหนดสีในสคริปต์ทุบตีของคุณเช่น:
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}."
คุณสามารถใช้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"
echo -e
ไม่ได้printf
และยังต้องเตือนว่ามันแตกต่างจากที่ตัวเลือกในการที่จะไม่ปรับให้เข้ากับชุดโดยอัตโนมัติtput
$TERM
ใน zsh :
autoload -U colors
colors
echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
print -P '%F{red}blah%f'
สำหรับการใช้งานทั่วไปอย่างง่าย (ข้อความเต็มบรรทัดในสีเดียวเท่านั้นพร้อมการขึ้นบรรทัดใหม่) ฉันแก้ไขโค้ดของ 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 -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" }'
ดีกว่าคือการใช้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
ตัวแปรของคุณตามที่เสนอในโซลูชันนี้