มีประโยชน์ใด ๆ ในการหลีกเลี่ยงซีเควนเชียลของ tput หรือไม่?


11

ในผู้คน ' .*rcแฟ้ม' ฉันเห็นออนไลน์หรือในรหัสต่าง ๆ ผมมักจะเห็นผู้คนจำนวนมากที่ตนเองใช้ลำดับหนี ANSI tputแทนการใช้

ฉันมีความเข้าใจที่tputเป็นสากล / ปลอดภัยกว่าดังนั้นฉันจึงสงสัยว่า:

มีเหตุผลอย่างใดอย่างหนึ่งที่ควรใช้ลำดับหลีกเลี่ยงแทนtput? (การพกพาความทนทานต่อข้อผิดพลาดขั้วผิดปกติ ... ?)


ด้านพลิกของคำถามเกี่ยวกับการพกพา MobaXterm จะทำงานร่วมกับprintfและ ANSI escape sequences แต่tputล้มเหลว (อย่างน้อยก็ในกล่องของฉัน)
สัญลักษณ์แทน

คำตอบ:


6

tputสามารถจัดการกับนิพจน์ (เช่นในsgrและsetaf) ซึ่ง shell-scripter ทั่วไปจะพบว่าใช้งานได้น้อยกว่า หากต้องการทราบว่าเกี่ยวข้องกับอะไรให้ดูผลลัพธ์จากinfocmpการ-fใช้ตัวเลือก (การจัดรูปแบบ) นี่คือตัวอย่างหนึ่งที่ใช้สตริงเหล่านั้นจากคำอธิบาย terminfoของ xterm :

xterm-16color|xterm with 16 colors,
        colors#16,
        pairs#256,
        setab=\E[
                %?
                        %p1%{8}%<
                        %t%p1%{40}%+
                %e
                        %p1%{92}%+
                %;%dm,
        setaf=\E[
                %?
                        %p1%{8}%<
                        %t%p1%{30}%+
                %e
                        %p1%{82}%+
                %;%dm,
        setb=
                %p1%{8}%/%{6}%*%{4}%+\E[%d%p1%{8}%m%Pa
                %?%ga%{1}%=
                        %t4
                %e%ga%{3}%=
                        %t6
                %e%ga%{4}%=
                        %t1
                %e%ga%{6}%=
                        %t3
                %e%ga%d
                %;
                m,
        setf=
                %p1%{8}%/%{6}%*%{3}%+\E[%d%p1%{8}%m%Pa
                %?%ga%{1}%=
                        %t4
                %e%ga%{3}%=
                        %t6
                %e%ga%{4}%=
                        %t1
                %e%ga%{6}%=
                        %t3
                %e%ga%d
                %;
                m,
        use=xterm+256color,
        use=xterm-new,

การจัดรูปแบบแยกสิ่งต่าง ๆ ออกไป - สคริปต์หรือโปรแกรมที่จะทำเช่นเดียวกันจะต้องติดตามการบิดและการหมุนเหล่านั้น คนส่วนใหญ่ยอมแพ้และใช้สายที่ง่ายที่สุด

คุณลักษณะ 16 สีถูกยืมจาก IBM aixterm ซึ่งแม็พรหัส 16 รหัสสำหรับพื้นหน้าและพื้นหลังลงบนสองช่วง

  • เบื้องหน้าสู่ 30-37 และ 90-97
  • พื้นหลังลงบน 40-47 และ 100-107

สคริปต์ง่าย ๆ

#!/bin/sh
TERM=xterm-16color
export TERM
printf '    %12s %12s\n' Foreground Background
for n in $(seq 0 15)
do
    F=$(tput setaf $n | cat -v)
    B=$(tput setab $n | cat -v)
    printf '%2d  %12s %12s\n' $n "$F" "$B"
done

และเอาท์พุทแสดงวิธีการทำงาน:

      Foreground   Background
 0        ^[[30m       ^[[40m
 1        ^[[31m       ^[[41m
 2        ^[[32m       ^[[42m
 3        ^[[33m       ^[[43m
 4        ^[[34m       ^[[44m
 5        ^[[35m       ^[[45m
 6        ^[[36m       ^[[46m
 7        ^[[37m       ^[[47m
 8        ^[[90m      ^[[100m
 9        ^[[91m      ^[[101m
10        ^[[92m      ^[[102m
11        ^[[93m      ^[[103m
12        ^[[94m      ^[[104m
13        ^[[95m      ^[[105m
14        ^[[96m      ^[[106m
15        ^[[97m      ^[[107m

ตัวเลขถูกแบ่งออกเนื่องจาก aixterm ใช้ช่วง 30-37 และ 40-47 เพื่อจับคู่สี ECMA-48 (หรือที่เรียกว่า "ANSI") และใช้ช่วง 90-107 สำหรับรหัสที่ไม่ได้กำหนดไว้ในมาตรฐาน

นี่คือภาพหน้าจอที่ใช้ xterm TERM=xterm-16colorซึ่งคุณสามารถเห็นเอฟเฟกต์

ป้อนคำอธิบายรูปภาพที่นี่

อ่านเพิ่มเติม:


ฉันอาจจะพิสูจน์ประเด็นของคุณ แต่อะไรคือข้อตกลงกับสำนวนเหล่านี้? จากการดูคู่มือสำหรับ infocmp ฉันรู้ว่าพวกเขาเป็นคำสั่ง if-then-else ... แต่ฉันไม่เคยเห็นมันมาก่อนและฉันมีปัญหากับการหาข้อมูลนี่คือทั้งหมดที่ฉันพบ แต่ฉันไม่แน่ใจว่ามันเป็น เกิดอะไรขึ้นที่นี่ ขอบคุณ!
Captain Man

2

มาจากช่วงเวลาที่แพลตฟอร์ม UNIX สามารถมีอุปกรณ์ที่หลากหลายติดกับพวกเขาฉันยังชอบ tput และเพื่อน ๆ ของมันมากกว่าลำดับการหลบหนีที่แท้จริง

ฉันคิดว่าเหตุผลที่แท้จริงคือคนส่วนใหญ่ไม่รู้จักtputและเกี่ยวข้องกับterminfo/ termcapไฟล์และไลบรารี


1

หนึ่งในเหตุผลคือนั่นtputคือคำสั่งภายนอกดังนั้นอาจทำงานช้ากว่ารหัสหนีเชลล์ในตัว อีกสิ่งหนึ่งคือหนึ่งสามารถสร้างหนึ่ง liners รวมรหัสการหลบหนี ANSI กับอักขระยกเว้นเฉพาะเชลล์เช่นในbashพร้อมท์ตัวอย่าง:

PS1='\[\033[1;32m\]\u@\h\[\033[1;34m\] \w >\[\033[0m\] '

ในทำนองเดียวกันในzsh:

PS1=$'%{\e[1;32m%}%n@%m%{\e[1;34m%} %3~> %{\e[0m%}'

ทุกอย่างที่นี่ชัดเจนและกะทัดรัด ด้วยtputหนึ่งจะต้องแยกมันเป็นหลายบรรทัดหรือทำให้มันยาวและซับซ้อนมากขึ้นบรรทัดดำเนินการtputหลายครั้ง ฯลฯ


1
ด้วย tput คุณยังสามารถทำ oneliners PS1="$(tput setaf 2)\u@\h$(tput reset) >
กัปตัน Man

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