Можно ли изменить атрибуты шрифта вывода echo в zsh или bash?
То, что я хотел бы, это что-то вроде:
echo -n "This is the font: normal "
echo -n $font=italic "italic,"
echo -n $font=bold "bold,"
echo -n "and"
echo -n $font=small "small".
чтобы в строке текста было напечатано: «Это шрифт: обычный, курсив , полужирный , маленький ».
Ответы:
В большинстве, если не во всех эмуляторах терминала, вы не можете установить разные размеры шрифтов или разные шрифты, только цвета и несколько атрибутов (жирный, подчеркнутый, выделенный).
В bash (или в zsh, или в любой другой оболочке) вы можете напрямую использовать escape-последовательности терминала (кроме нескольких экзотических, все терминалы следуют примеру xterm в наши дни).
CSI
этоESC [
, написано$'\e['
в Баш. Последовательность побег атрибутам измененияCSI Ps m
.У Zsh есть удобная функция для этого.
источник
Вы можете включить эти определения цвета в скрипт или исходный файл. Может выглядеть примерно так.
Обратите внимание, что вы должны сбрасывать цветовые коды ANSI после каждого изменения, которое вы вносите. В
tput sgr0
сбрасывает все изменения, сделанные вами в терминале.Я считаю, что изменение размера шрифта или курсива будет зависеть от терминала, который вы используете.
Хотя это руководство предназначено для настройки вашего приглашения bash, оно является хорошим справочником для цветовых кодов и дает некоторые идеи о том, что вы можете сделать.
источник
Похоже, что макет не может обрабатывать
[0x1b]
символ-перед перед[
.Первая строка выделяет жирным шрифтом:
Для общего типа я знаю только
и из комментариев, спасибо manatwork и GypsyCosmonaut:
и не знаю разницу между IO-STD и нормальным.
Я не видел курсив или маленький в раковине.
Вы можете ввести их (благодаря manatwork тоже) с помощью Ctrl + v ESC в Bash, где он будет отображаться как
^[
. Это означает, что вся последовательность ANSI будет выглядеть^[[1m bold
или^[[1mbold
(чтобы избежать пробела перед полужирным шрифтом).Многие редакторы имеют проблемы с (char) 0x1b. Альтернативы: скопируйте / вставьте его откуда-либо или используйте
в bash или в шестнадцатеричном редакторе.
источник
\e[4m
подчеркнутые,\e[5m
мигающие,\e[7m
инвертированные.echo -e "\x1b[3m italic"
Вот:
http://en.wikipedia.org/wiki/ANSI_escape_code
(примечание: многие из них обычно не работают, но большинство из них помечены таким образом.)
Я делаю игру в терминале и очень полагаюсь на ссылку выше. Он даже говорит о том, как скрыть / показать курсор, сделать цвет (30-е), «жирным» (светлее), темнее, подчеркнутым, курсивом, цвет фона (40-е вместо 30-х) и т. Д. Вы также можете изменить местоположение курсора ( что очень полезно - например,
"\x1B[1A"
перемещает курсор вверх на одну строку,"\x1B[0;0H"
перемещает курсор в строку 0, столбец 0;"\x1B[2J"
очищает экран;"\x1B[2K"
очищает строку.Для ваших целей, как люди сказали:
Примечание: Вы нужно
-e
вили вам нужно использовать одинарные кавычки. Напечатайте,
man echo
чтобы понять, почему (двойные кавычки, как правило, являются болью при печати; когда мне нужно, чтобы материал не расширялся, или мне нужны экранирующие последовательности ANSI, я использую одинарные кавычки, потому что это легко - даже несмотря на то, что я привык к этому много раз - забыть -е, в этом случае вы получите «box with numbers and letters
[35; 1m»).Каждый раз, когда вы видите,
CSI
замените его"\x1b["
(или"\e["
или"\u1b["
)."\x1b["
Я думаю, что это более стандартно, но я не знаю, в чем разница между ними.источник
\e
менее поддерживается, чем\x1b
я нашел. Оптимальным будет сделать либоesc=$'\e'
илиesc=$'\x1b'
(это в bash), а затем использовать"${esc}[34;1m"
(например, ярко-синий). У меня есть полусложный пример ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) для реальной строки приглашения bash;) Пожалуйста, простите имя репо - вы можете поблагодарить людей на канале freenode # archlinux-оффтоп для этого.esc=$'\e'
является то, что это позволяет bash создать на месте персонажа ansi-escape, и вы получаете выгоду от него несколькими способами. На самом деле иногда (как показано в ссылке на github) вы должны использовать этот метод, чтобы цвета правильно отображались. Для более старых версий bash, а также оболочки sh, вы должны (но не обязаны) использовать этот метод для отображения цвета ... при условии, что терминал использует escape-последовательности, которые используют большинство современных терминалов.