ฉันต้องการทราบว่ามีวิธีใดบ้างที่จะตรวจสอบว่าโปรแกรมของฉันสามารถส่งออกเทอร์มินัลโดยใช้สีหรือไม่
การเรียกใช้คำสั่งเช่นless
และดูผลลัพธ์จากโปรแกรมที่เอาต์พุตโดยใช้สีเอาต์พุตจะแสดงผิดเช่น
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
ขอบคุณ
ฉันต้องการทราบว่ามีวิธีใดบ้างที่จะตรวจสอบว่าโปรแกรมของฉันสามารถส่งออกเทอร์มินัลโดยใช้สีหรือไม่
การเรียกใช้คำสั่งเช่นless
และดูผลลัพธ์จากโปรแกรมที่เอาต์พุตโดยใช้สีเอาต์พุตจะแสดงผิดเช่น
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
ขอบคุณ
คำตอบ:
แนวคิดสำหรับแอปพลิเคชันของฉันที่จะรู้ว่าไม่ให้สีเอาท์พุทถ้าโปรแกรมไม่สามารถพิมพ์พูดบันทึกผลลัพธ์จากผ่านงาน cron ไปยังไฟล์ไม่จำเป็นต้องบันทึกผลลัพธ์สี แต่เมื่อทำงานด้วยตนเองฉันชอบดู สีเอาท์พุท
คุณเขียนใบสมัครด้วยภาษาอะไร
วิธีการปกติคือการตรวจสอบว่าอุปกรณ์เอาต์พุตเป็น tty หรือไม่และตรวจสอบว่าเทอร์มินัลประเภทนั้นรองรับสีหรือไม่
ในbash
นั้นจะมีลักษณะ
# check if stdout is a terminal...
if test -t 1; then
# see if it supports colors...
ncolors=$(tput colors)
if test -n "$ncolors" && test $ncolors -ge 8; then
bold="$(tput bold)"
underline="$(tput smul)"
standout="$(tput smso)"
normal="$(tput sgr0)"
black="$(tput setaf 0)"
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
blue="$(tput setaf 4)"
magenta="$(tput setaf 5)"
cyan="$(tput setaf 6)"
white="$(tput setaf 7)"
fi
fi
echo "${red}error${normal}"
echo "${green}success${normal}"
echo "${green}0.052${normal} ${bold}${green}2,816.00 kb${normal}"
# etc.
ใน C, ที่คุณต้องทำในการพิมพ์มากขึ้น แต่สามารถบรรลุผลเดียวกันโดยใช้isattyman 3 terminfo
และฟังก์ชั่นที่ระบุไว้ใน
ควรจะเพียงพอ:
$ tput colors
หากคุณดู manpage คุณจะสังเกตเห็นสิ่งนี้:
SYNOPSIS
tput [-Ttype] capname [parms ... ]
และ...
capname
indicates the capability from the terminfo database. When term‐
cap support is compiled in, the termcap name for the capability
is also accepted.
termcap colors
อยู่ในฐานข้อมูล terminfo ดังนั้นคุณสามารถขอได้ หากคุณมีสถานะออกจากศูนย์แล้ว termcap จะถูกรวบรวมไว้ แต่ถ้าคุณมี somethin เช่น:
$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4
สิ่งนี้แสดงให้เห็นว่า unknowntermcap ไม่มีอยู่ ดังนั้นนี่
$ tput colors
8
$ echo $?
0
แสดงให้เห็นว่าคำสั่งของคุณถูกต้อง
ไชโย
colors
ไม่มีการบันทึกไว้ในtput
man page (!) ดังนั้นฉันควรค้นหาหมายเลข> = 8 ใน stdout หรือรหัสส่งคืนเป็น 0 หรือไม่
colors
ความสามารถในการบันทึกไว้ในterminfo (5) ทดสอบการใช้tput -T dumb colors
, tput -T vt220 colors
, tput -T linux colors
, tput -T xterm colors
แสดงให้เห็นค่านิยมร่วมกันมี-1
(ไม่มีการสนับสนุนสี) และ8
(8 สี) โปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะหลังจากการตรวจสอบอุปกรณ์ส่งออกเป็นขั้ว (เช่น[ -t 1 ]
หรือisatty
)
tput colors
จะส่งคืนสิ่งที่ฐานข้อมูลเทอร์มินัลท้องถิ่นคิดว่าเทอร์มินัล สิ่งนี้อาจหรืออาจไม่สอดคล้องกับสิ่งที่เครื่องสามารถทำได้จริงโดยเฉพาะอย่างยิ่งสำหรับประเภทอาคารที่ชอบxterm
ซึ่งมีหลายรูปแบบ (ตั้งแต่ขาวดำและ 256 สี)
แนวคิดสำหรับแอปพลิเคชันของฉันที่จะรู้ว่าไม่ให้สีเอาท์พุทถ้าโปรแกรมไม่สามารถพิมพ์พูดบันทึกผลลัพธ์จากผ่านงาน cron ไปยังไฟล์ไม่จำเป็นต้องบันทึกผลลัพธ์สี แต่เมื่อทำงานด้วยตนเองฉันชอบดู สีเอาท์พุท
สำหรับกรณีการใช้งานนี้สิ่งที่โปรแกรมทั่วไปทำ (เช่น GNU ls หรือ GNU grep ด้วย--color=auto
) คือการใช้สีถ้าเอาท์พุทของพวกเขากำลังจะไปที่สถานีและไม่มีสีอื่น เทอร์มินัลที่ไม่สนับสนุนลำดับการเปลี่ยนสี ANSI นั้นหายากมากพอที่จะทำให้ผู้ใช้แทนที่ตัวเลือกเริ่มต้น ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณมีตัวเลือกในการบังคับเปิดหรือปิดสี
ในเชลล์สคริปต์ใช้[ -t 1 ]
เพื่อทดสอบว่าเอาต์พุตมาตรฐานเป็นเทอร์มินัลหรือไม่
# option processing has set $color to yes, no or auto
if [ $color = auto ]; then
if [ -t 1 ]; then color=yes; else color=no; fi
fi
จากโปรแกรมโดยใช้ C API isatty(1)
โทร
# option processing has set use_color to 0 for no, 1 for yes or 2 for auto
if (use_color == 2) use_color = isatty(1);
การเรียกใช้คำสั่งเช่นน้อยลงและดูผลลัพธ์จากโปรแกรมที่เอาต์พุตโดยใช้สีเอาต์พุตจะแสดงผิดเช่น
[ESC [0; 32m0.052ESC [0m ESC [1; 32m2,816.00 kbESC [0m]
ลองใช้less --RAW-CONTROL-CHARS
ดู
ในตัวอย่างนี้ฉันใช้logtoolซึ่งพิมพ์ผลลัพธ์โดยใช้สี
โดยไม่ต้อง - การควบคุม -CharS:
$ head -20 /var/log/messages | logtool | less
ESC[0mESC[0;37mMar 20 11:43:52ESC[0mESC[1;36m host1ESC[0mESC[0;37m rsyslogd:ESC[0m ^GESC[0;31mlast message repeated 14 timesESC[0mESC[0m
ด้วย --RAW-CONT-CHAR (ลองจินตนาการว่านี่เป็นสีสวยนอกจากนี้ฉันไม่แน่ใจว่าทำไมถึง^G
แสดงผล)
$ head -20 /var/log/messages | logtool | less --RAW-CONTROL-CHARS
Mar 20 11:43:52 host1 rsyslogd: ^Glast message repeated 14 times
นั่นจะเป็นความผิดที่less
ไม่ได้ถูกตั้งค่าให้แปลความหมายของ ANSI; มองหาในR
$LESSOPTS
สำหรับการพิจารณาว่าระบบรู้ว่าเทอร์มินัลของคุณสามารถจัดการกับสีได้หรือไม่tput colors
ก็จะแสดงจำนวนสีที่รองรับหรือ-1
หากไม่รองรับสี (โปรดทราบว่าเทอร์มินัลบางตัวอาจใช้xterm
แทนxterm-color
คำอธิบายเทอร์มินัล แต่ยังคงรองรับสี)
หากคุณต้องการที่จะเพิ่มสีสันให้กับการส่งออก tput
แต่เมื่อสีได้รับการสนับสนุนคุณก็สามารถใช้ http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html