วิธีการตรวจสอบว่าทุบตีสามารถพิมพ์สี


62

ฉันต้องการทราบว่ามีวิธีใดบ้างที่จะตรวจสอบว่าโปรแกรมของฉันสามารถส่งออกเทอร์มินัลโดยใช้สีหรือไม่

การเรียกใช้คำสั่งเช่นlessและดูผลลัพธ์จากโปรแกรมที่เอาต์พุตโดยใช้สีเอาต์พุตจะแสดงผิดเช่น

[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]

ขอบคุณ



ดูเพิ่มเติมพิมพ์รูปแบบการทดสอบ 256 สีใน terminal - ถามอูบุนตู
Franklin Yu

คำตอบ:


68

แนวคิดสำหรับแอปพลิเคชันของฉันที่จะรู้ว่าไม่ให้สีเอาท์พุทถ้าโปรแกรมไม่สามารถพิมพ์พูดบันทึกผลลัพธ์จากผ่านงาน 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และฟังก์ชั่นที่ระบุไว้ใน


^^ ^^ ว่าเป็นว่าสิ่งที่ผมกำลังมองหา ขอบคุณ
Tim Kennedy

ขอบคุณสำหรับคำแนะนำเกี่ยวกับการ tput นี่เป็นคำตอบที่ยอดเยี่ยมจริงๆ
AmadeusDrZaius

24

ควรจะเพียงพอ:

$ tput colors

สี tput อธิบาย:

หากคุณดู 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

แสดงให้เห็นว่าคำสั่งของคุณถูกต้อง

วิธีที่มีประโยชน์อื่น ๆ :

  • ใน C คุณสามารถใช้isattyและดูว่าเป็น TTY หรือไม่
  • ดูว่าเป็นเทอร์มินัลโง่ที่มองตัวแปร $ TERM หรือไม่

ไชโย


colorsไม่มีการบันทึกไว้ในtputman page (!) ดังนั้นฉันควรค้นหาหมายเลข> = 8 ใน stdout หรือรหัสส่งคืนเป็น 0 หรือไม่
l0b0

ดูเหมือนจะชัดเจน แต่ความคิดเห็นของคุณแสดงว่าไม่ใช่ ฉันกำลังเพิ่มข้อมูลนั้น (สั้น ๆ สีเป็นความสามารถของฐานข้อมูล terminfo)
D4RIO

1
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)
Mikel

โปรดทราบว่าtput colorsจะส่งคืนสิ่งที่ฐานข้อมูลเทอร์มินัลท้องถิ่นคิดว่าเทอร์มินัล สิ่งนี้อาจหรืออาจไม่สอดคล้องกับสิ่งที่เครื่องสามารถทำได้จริงโดยเฉพาะอย่างยิ่งสำหรับประเภทอาคารที่ชอบxtermซึ่งมีหลายรูปแบบ (ตั้งแต่ขาวดำและ 256 สี)
Gilles

7

แนวคิดสำหรับแอปพลิเคชันของฉันที่จะรู้ว่าไม่ให้สีเอาท์พุทถ้าโปรแกรมไม่สามารถพิมพ์พูดบันทึกผลลัพธ์จากผ่านงาน 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);

5

การเรียกใช้คำสั่งเช่นน้อยลงและดูผลลัพธ์จากโปรแกรมที่เอาต์พุตโดยใช้สีเอาต์พุตจะแสดงผิดเช่น

[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

2

นั่นจะเป็นความผิดที่lessไม่ได้ถูกตั้งค่าให้แปลความหมายของ ANSI; มองหาในR $LESSOPTSสำหรับการพิจารณาว่าระบบรู้ว่าเทอร์มินัลของคุณสามารถจัดการกับสีได้หรือไม่tput colorsก็จะแสดงจำนวนสีที่รองรับหรือ-1หากไม่รองรับสี (โปรดทราบว่าเทอร์มินัลบางตัวอาจใช้xtermแทนxterm-colorคำอธิบายเทอร์มินัล แต่ยังคงรองรับสี)


แนวคิดสำหรับแอปพลิเคชันของฉันที่จะรู้ว่าไม่ให้สีเอาท์พุทถ้าโปรแกรมไม่สามารถพิมพ์พูดบันทึกผลลัพธ์จากงาน cron ไปยังไฟล์ไม่จำเป็นต้องบันทึกผลลัพธ์สี แต่เมื่อทำงานด้วยตนเองฉันชอบดู สีเอาท์พุท
Angelo Vargas

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