Apakah ada manfaat obyektif untuk menghindari urutan lebih dari tput?

11

Dalam .*rcfile orang yang saya lihat online atau dalam berbagai kode, saya cenderung melihat banyak orang yang secara manual menggunakan urutan pelarian ANSI alih-alih menggunakan tput.

Saya memiliki pemahaman yang tputlebih universal / aman, jadi ini membuat saya bertanya-tanya:

Apakah ada alasan obyektif yang harus digunakan seseorang untuk menghindari urutan tput? (Portabilitas, ketahanan kesalahan, terminal tidak biasa ...?)

Kapten Man
sumber
Di sisi lain dari pertanyaan portabilitas, MobaXterm akan bekerja dengan printfdan urutan pelarian ANSI, tetapi tputgagal (setidaknya pada kotak saya).
Wildcard

Jawaban:

6

tputdapat menangani ekspresi (misalnya dalam sgrdan setaf) yang ditemukan oleh shell-scripter yang kurang berguna. Untuk mendapatkan gagasan tentang apa yang terlibat, lihat output dari infocmpdengan opsi -f(pemformatan) yang diterapkan. Berikut adalah salah satu contoh menggunakan string tersebut dari deskripsi 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,

Pemformatan membagi segalanya - sebuah skrip atau program untuk melakukan hal yang sama harus mengikuti tikungan dan belokan tersebut. Kebanyakan orang menyerah dan hanya menggunakan string yang paling mudah.

Fitur 16 warna dipinjam dari IBM aixterm, yang memetakan 16 kode masing-masing untuk latar depan dan latar belakang ke dalam dua rentang;

  • foreground ke 30-37, dan 90-97
  • latar belakang ke 40-47, dan 100-107

Sebuah skrip sederhana

#!/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

dan output menunjukkan cara kerjanya:

      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

Angka-angka dibagi karena aixterm menggunakan rentang 30-37 dan 40-47 untuk mencocokkan warna ECMA-48 (juga dikenal sebagai "ANSI"), dan menggunakan kisaran 90-107 untuk kode yang tidak didefinisikan dalam standar.

Berikut ini adalah screenshot dengan xterm yang digunakan TERM=xterm-16color, di mana Anda dapat melihat efeknya.

masukkan deskripsi gambar di sini

Bacaan lebih lanjut:

Thomas Dickey
sumber
Saya mungkin membuktikan maksud Anda, tetapi apa masalahnya dengan ungkapan-ungkapan ini? Dari melihat manual untuk infocmp saya menyadari bahwa itu adalah pernyataan if-then-else ... tapi saya belum pernah melihat ini dan saya mengalami masalah dengan googling untuk itu, ini yang saya temukan, tapi saya tidak yakin itu apa yang terjadi disini. Terima kasih!
Kapten Man
2

Berasal dari masa ketika platform UNIX dapat memiliki berbagai perangkat yang menyertainya, saya masih lebih suka tput dan teman-temannya daripada sekuens pelarian literal.

Saya pikir alasan sebenarnya adalah bahwa kebanyakan orang tidak tahu tentang tputdan yang terkait terminfo/ termcapfile dan perpustakaan.

roaima
sumber
1

Salah satu alasannya adalah itu tputadalah perintah eksternal, jadi mungkin berjalan lebih lambat daripada kode shell escape bawaan. Hal lain adalah bahwa seseorang dapat dengan mudah membuat satu liner yang menggabungkan kode pelarian ANSI dengan karakter lolos spesifik shell, seperti pada bashprompt misalnya:

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

serupa di zsh:

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

Di sini semuanya jelas dan kompak. Dengan tputsatu akan perlu membaginya menjadi beberapa baris atau membuatnya menjadi garis yang lebih panjang dan kompleks, mengeksekusi tputbeberapa kali, dll.

jimmij
sumber
1
Dengan tput Anda masih bisa melakukan oneliners, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Kapten Man
2
Sebenarnya itu akan menjadi $(tput sgr0)akhir, tetapi menyetujui bahwa tput adalah perbaikan.
Thomas Dickey