Чи є якась об єктивна вигода уникнути послідовностей над tput?


11

У .*rcфайлах людей, які я бачу в Інтернеті або в різному коді, я бачу багато людей, які замість використання вручну використовують послідовності втечі ANSI tput.

У мене було розуміння, що tputбільш універсальне / безпечне, тому це змушує мене замислитися:

Чи є якась об'єктивна причина, на яку слід використовувати послідовності втечі tput? (Переносимість, надійність помилок, незвичні термінали ...?)


Що стосується питання переносимості, MobaXterm буде працювати з printfпослідовностями входу і ANSI, але tputне вдається (принаймні, у моєму вікні).
Wildcard

Відповіді:


6

tputможе обробляти вирази (наприклад, в sgrі setaf), які типовий сценарій оболонки знайде менше, ніж корисний. Для того, щоб отримати уявлення про те , що бере участь, побачити вихід з infocmpз -fваріантом (форматування) застосовується. Ось один із прикладів використання цих рядків із опису термінів 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, я усвідомлюю, що це твердження якщо тоді, але я ніколи цього не бачив, і у мене виникають проблеми з гугл, це все, що я знайшов, але я не впевнений, що це що тут відбувається. Дякую!
Капітан Людина

2

Починаючи з часів, коли на платформах UNIX могли бути приєднані різноманітні пристрої, я все ще віддаю перевагу tput та його друзям над буквальними послідовностями втечі.

Я думаю , що реальна причина в тому , що більшість людей просто не знають про те, tputі пов'язані з ним terminfo/ termcapфайли і бібліотеки.


1

Одна з причин - tputзовнішня команда, тому вона може працювати повільніше, ніж вбудовані коди втечі оболонки. Інша справа, що можна легко створити один вкладиш, який поєднує коди аварійних відхилень 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) >
Капітан Ман

2
Насправді це було б $(tput sgr0)для кінця, але, погоджуючись, що tput - це покращення.
Томас Дікі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.