Tput üzerinden dizilerden kaçmanın herhangi bir nesnel faydası var mı?


11

.*rcÇevrimiçi veya çeşitli kodlarda gördüğüm kişilerin dosyalarında, ANSI kaçış dizilerini kullanmak yerine manuel olarak kullanan birçok insan görmeye eğilimliyim tput.

tputDaha evrensel / güvenli bir anlayışa sahiptim, bu yüzden bu beni meraklandırıyor:

Kaçış dizilerinin yerine kullanılması gereken herhangi bir nesnel sebep var mı tput? (Taşınabilirlik, hatalarda sağlamlık, olağandışı terminaller ...?)


Taşınabilirlik sorusunun kapak tarafında, MobaXterm printfve ANSI kaçış dizileriyle çalışır, ancak tputbaşarısız olur (en azından kutumda).
Wildcard

Yanıtlar:


6

tputtipik kabuk komut dosyasının kullanılabilir olandan daha az bulacağı ifadeleri (örneğin sgrve içinde setaf) işleyebilir . Dan ilgili ne bir fikir edinmek için, çıkış görmek infocmpile -f(biçimlendirme) seçeneği uygulanır. İşte bu dizeleri xterm'in terminfo açıklamalarından kullanan örneklerden biri :

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,

Biçimlendirme işleri böler - aynı şeyi yapan bir komut dosyası veya program bu dönüşleri takip etmek zorunda kalır. Çoğu insan vazgeçer ve sadece en kolay ipleri kullanır.

16 renk özelliği, her biri ön plan ve arka plan için 16 kodu iki aralıkla eşleyen IBM aixterm'den ödünç alınmıştır;

  • 30-37 ve 90-97 üzerine ön plan
  • 40-47 ve 100-107 üzerine arka plan

Basit bir komut dosyası

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

ve çıktı nasıl çalıştığını gösterir:

      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

Numaraları aixterm ECMA-48 renk (aynı zamanda "ANSI" olarak da bilinir) eşleştirmek için 30-37 ve 40-47 aralıkları kullanır ve kodlar için 90-107 aralığı kullandığından bölünür olmayan standardında tanımlanmıştır.

TERM=xterm-16colorEtkisini görebileceğiniz xterm kullanan bir ekran görüntüsü .

resim açıklamasını buraya girin

Daha fazla okuma:


Demek istediğini kanıtlıyor olabilirim, ama bu ifadelerle olan anlaşma nedir? İnfocmp için manuel bakarak onlar if-then-else ifadeleri olduğunun farkında ... ama bu hiç görmedim ve bunun için googling sorun yaşıyorum, bu tüm buldum, ama emin olduğunu değilim burada ne oluyor. Teşekkürler!
Kaptan Adam

2

UNIX platformlarının kendilerine bağlı çeşitli cihazlara sahip olabileceği bir zamandan beri, hala tput ve arkadaşlarını gerçek kaçış dizilerine tercih ediyorum.

Bence asıl sebep, çoğu insanın bilmediği tputve onunla ilişkili terminfo/ termcapdosyalar ve kütüphaneler.


1

Bunun nedeni tputharici komuttur, bu nedenle yerleşik kabuk kaçış kodlarından daha yavaş çalışabilir. Başka bir şey, ANSI kaçış kodlarını, örneğin bashkomut isteminde olduğu gibi, kabuktan kaçan karakterlerle birleştiren bir astar kolayca oluşturabilmesidir :

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

benzer şekilde zsh:

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

Burada her şey açık ve kompakt. İle tputbir çoklu satıra bölmek ya da çok daha uzun ve karmaşık bir çizgi yapmak, yürütmek gerekir tputvs. birden çok kez


1
Tput ile hala oneliners yapabilirsiniz, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Kaptan Adam

2
Aslında bu son $(tput sgr0)için olurdu , ama tput'un bir gelişme olduğunu kabul etmek.
Thomas Dickey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.