Czy jest jakaś obiektywna korzyść z ucieczki sekwencji przed tput?

11

W .*rcplikach ludzi, które widzę online lub w różnych kodach, widzę wielu ludzi, którzy ręcznie używają sekwencji ucieczki ANSI zamiast ich używać tput.

Zrozumiałem, że tputjest bardziej uniwersalny / bezpieczny, więc zastanawiam się:

Czy istnieje jakiś obiektywny powód powinien wykorzystywać sekwencje w miejscu tput? (Przenośność, odporność na błędy, nietypowe terminale ...?)

Kapitanie Człowieku
źródło
Z drugiej strony pytania dotyczącego przenośności, MobaXterm będzie działał z printfsekwencjami ucieczki ANSI, ale tputzawodzi (przynajmniej w moim pudełku).
Wildcard

Odpowiedzi:

6

tputradzi sobie z wyrażeniami (na przykład w sgri setaf), które typowy skrypt-shell uznałby za mało użyteczne. Aby zorientować się, co jest zaangażowany, zobaczymy wyniku infocmpz -fstosowana (formatowanie) opcja. Oto jeden z przykładów użycia tych ciągów z opisów 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,

Formatowanie dzieli rzeczy - skrypt lub program, aby zrobić to samo, musiałby podążać za tymi zwrotami akcji. Większość ludzi poddaje się i używa najłatwiejszych ciągów.

Funkcja 16 kolorów została zapożyczona z IBM aixterm, która mapuje 16 kodów dla każdego planu pierwszego i tła na dwa zakresy;

  • na pierwszym planie na 30-37 i 90-97
  • tło na 40-47 i 100-107

Prosty skrypt

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

a dane wyjściowe pokazują, jak to działa:

      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

Liczby są podzielone, ponieważ aixterm używa zakresów 30–37 i 40–47, aby dopasować kolory ECMA-48 (znane również jako „ANSI”), i używa zakresu 90–107 dla kodów nie zdefiniowanych w standardzie.

Oto zrzut ekranu z użyciem Xterm TERM=xterm-16color, gdzie możesz zobaczyć efekt.

wprowadź opis zdjęcia tutaj

Dalsza lektura:

Thomas Dickey
źródło
Być może potwierdzam twoją tezę, ale o co chodzi z tymi wyrażeniami? Patrząc na instrukcję dla infocmp, zdaję sobie sprawę, że są to stwierdzenia „jeśli-to-inaczej” ... ale nigdy tego nie widziałem i mam problem z wyszukaniem go, to wszystko, co znalazłem, ale nie jestem pewien, czy to co tu się dzieje. Dzięki!
Captain Man,
2

Wychodząc z czasów, gdy platformy UNIX mogły mieć podłączone różne urządzenia, nadal wolę tput i jego przyjaciół od dosłownych sekwencji ucieczki.

Myślę, że prawdziwym powodem jest to, że większość ludzi po prostu nie wiem jak tputi jego powiązane terminfo/ termcappliki i biblioteki.

roaima
źródło
1

Jednym z powodów jest to, że tputjest to polecenie zewnętrzne, więc może działać wolniej niż wbudowane kody ucieczki powłoki. Inną rzeczą jest to, że można łatwo utworzyć jeden wkładka łączący kody ucieczki ANSI ze znakami ucieczki specyficznymi dla powłoki, na przykład w bashmonicie:

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

podobnie w zsh:

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

Tutaj wszystko jest jasne i zwarte. Z tputjednym trzeba by było podzielić go na wiele linii lub uczynić go znacznie dłuższą i złożoną, wykonując tputwiele razy itp.

jimmij
źródło
1
Z tput nadal możesz robić onelinerów, PS1="$(tput setaf 2)\u@\h$(tput reset) >
Captain Man
2
Właściwie byłoby to $(tput sgr0)na zakończenie, ale zgadzam się, że tput jest poprawą.
Thomas Dickey,