В людских .*rc
файлах, которые я вижу в Интернете или в различном коде, я склонен видеть множество людей, которые вручную используют escape-последовательности ANSI вместо использования tput
.
У меня было понимание, которое tput
является более универсальным / безопасным, поэтому я удивляюсь:
Есть ли какая-то объективная причина, по которой следует использовать escape-последовательности вместо tput
? (Переносимость, устойчивость к ошибкам, необычные терминалы ...?)
terminal
escape-characters
tput
Капитан человек
источник
источник
printf
escape-последовательностями и ANSI, ноtput
не работает (по крайней мере, на моем компьютере).Ответы:
tput
может обрабатывать выражения (например, вsgr
иsetaf
), которые типичный shell-скриптер найдет менее пригодными для использования. Чтобы получить представление о том, что задействовано, смотрите выводinfocmp
с-f
примененной опцией (форматирование). Вот один из примеров использования этих строк из описаний terminfo в xterm :Форматирование разделяет вещи - скрипт или программа, чтобы сделать то же самое, должны следовать этим поворотам. Большинство людей сдаются и просто используют самые простые струны.
16-цветная функция позаимствована у IBM aixterm, которая отображает 16 кодов для каждого переднего и заднего плана на два диапазона;
Простой скрипт
и выходные данные показывают, как это работает:
Числа разделены, потому что aixterm использует диапазоны 30-37 и 40-47 для соответствия цветам ECMA-48 (также известный как "ANSI"), и использует диапазон 90-107 для кодов, не определенных в стандарте.
Вот скриншот с использованием xterm
TERM=xterm-16color
, где вы можете увидеть эффект.Дальнейшее чтение:
infocmp
- сравнить или распечатать описания terminfotput
,reset
- инициализация терминала или запрос TERMINFO базы данныхaixterm
командаисточник
Исходя из того времени, когда к платформам UNIX можно было подключать различные устройства, я все еще предпочитаю tput и его друзей, а не буквальные escape-последовательности.
Я думаю , что реальная причина в том , что большинство людей просто не знают о том,
tput
и связанные с нимterminfo
/termcap
файлы и библиотеки.источник
Одна из причин заключается в том, что
tput
это внешняя команда, поэтому она может выполняться медленнее, чем встроенные экранирующие коды оболочки. Другое дело, что можно легко создатьbash
строки, комбинирующие escape-коды ANSI с экранированными символами, специфичными для оболочки, как, например, в подсказке:аналогично в
zsh
:Здесь все понятно и компактно. При
tput
этом потребуется разбить его на несколько строк или сделать его намного более длинной и сложной строкой, выполнитьtput
несколько раз и т. Д.источник
PS1="$(tput setaf 2)\u@\h$(tput reset) >
$(tput sgr0)
для финала, но согласиться с тем, что tput является улучшением.