Изменить шрифт в команде echo

16

Можно ли изменить атрибуты шрифта вывода 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".

чтобы в строке текста было напечатано: «Это шрифт: обычный, курсив , полужирный , маленький ».

Сардатрион - Восстановить Монику
источник
Это больше относится к рассматриваемому эмулятору терминала, чем к используемой оболочке. Я думаю, что эта ветка содержит несколько ценных указателей
sr_
Обычно вы не можете изменить размер шрифта. Единственное, что вы обычно можете сделать, это изменить цвет, а иногда и жирный / подчеркнутый атрибут. Для этого вы можете использовать escape-последовательности ANSI. См., Например, bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html для некоторых примеров.
Джофель

Ответы:

15

В большинстве, если не во всех эмуляторах терминала, вы не можете установить разные размеры шрифтов или разные шрифты, только цвета и несколько атрибутов (жирный, подчеркнутый, выделенный).

В bash (или в zsh, или в любой другой оболочке) вы можете напрямую использовать escape-последовательности терминала (кроме нескольких экзотических, все терминалы следуют примеру xterm в наши дни). CSIэто ESC [, написано $'\e['в Баш. Последовательность побег атрибутам изменения CSI Ps m.

echo $'\e[32;1mbold red\e[0mplain\e[4munderlined'

У Zsh есть удобная функция для этого.

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined
Жиль "ТАК - перестань быть злым"
источник
16

Вы можете включить эти определения цвета в скрипт или исходный файл. Может выглядеть примерно так.

#!/bin/bash
PATH=/bin:/usr/bin:

NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
PURPLE='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
UNDERLINE='\033[4m'

echo -e "This text is ${RED}red${NONE} and ${GREEN}green${NONE} and ${BOLD}bold${NONE} and ${UNDERLINE}underlined${NONE}."

tput sgr0

Обратите внимание, что вы должны сбрасывать цветовые коды ANSI после каждого изменения, которое вы вносите. В tput sgr0сбрасывает все изменения, сделанные вами в терминале.

Я считаю, что изменение размера шрифта или курсива будет зависеть от терминала, который вы используете.

Хотя это руководство предназначено для настройки вашего приглашения bash, оно является хорошим справочником для цветовых кодов и дает некоторые идеи о том, что вы можете сделать.

George M
источник
5

Похоже, что макет не может обрабатывать [0x1b]символ-перед перед [.

Первая строка выделяет жирным шрифтом:

 echo -e "\x1b[1m bold"
     echo -e "\x1b[30m black"
     echo -e "\x1b[31m red"
     echo -e "\x1b[32m green"
     echo -e "\x1b[33m yellow"
     echo -e "\x1b[34m blue"
     echo -e "\x1b[35m mag"
     echo -e "\x1b[36m cyan"
     echo -e "\x1b[37m white"   

Для общего типа я знаю только

echo -e "\x1b[0m io-std"
echo -e "\x1b[1m bold"
echo -e "\x1b[2m normal"

и из комментариев, спасибо manatwork и GypsyCosmonaut:

echo -e "\x1b[3m italic"
echo -e "\x1b[4m underlined"
echo -e "\x1b[5m blinking"
echo -e "\x1b[7m inverted"

и не знаю разницу между IO-STD и нормальным.

Я не видел курсив или маленький в раковине.

Вы можете ввести их (благодаря manatwork тоже) с помощью Ctrl + v ESC в Bash, где он будет отображаться как ^[. Это означает, что вся последовательность ANSI будет выглядеть ^[[1m boldили ^[[1mbold(чтобы избежать пробела перед полужирным шрифтом).

Многие редакторы имеют проблемы с (char) 0x1b. Альтернативы: скопируйте / вставьте его откуда-либо или используйте

echo -e "\x1b[1m bold"

в bash или в шестнадцатеричном редакторе.

Пользователь неизвестен
источник
1
Клавиши Escape могут быть набраны: Ctrl + V, Esc. (Будет отображаться как «^ [». Это означает, что вся последовательность ANSI будет выглядеть как «^ [[1mbold».)
manatwork
1
Есть еще атрибуты для упоминания: \e[4mподчеркнутые, \e[5mмигающие, \e[7mинвертированные.
manatwork
@manatwork: добавил их.
пользователь неизвестен
@userunknown Спасибо за помощь, возиться с вашим кодом, я нашел курсивecho -e "\x1b[3m italic"
GypsyCosmonaut
0

Вот:

http://en.wikipedia.org/wiki/ANSI_escape_code

(примечание: многие из них обычно не работают, но большинство из них помечены таким образом.)

Я делаю игру в терминале и очень полагаюсь на ссылку выше. Он даже говорит о том, как скрыть / показать курсор, сделать цвет (30-е), «жирным» (светлее), темнее, подчеркнутым, курсивом, цвет фона (40-е вместо 30-х) и т. Д. Вы также можете изменить местоположение курсора ( что очень полезно - например, "\x1B[1A"перемещает курсор вверх на одну строку, "\x1B[0;0H"перемещает курсор в строку 0, столбец 0; "\x1B[2J"очищает экран; "\x1B[2K"очищает строку.

Для ваших целей, как люди сказали:

echo -e "\x1b[30;44m black with blue background \x1b[m"

echo -e "\x1b[31;42m red with green background \x1b[m"

echo -e "\x1b[32;40m green with black background \x1b[m"

echo -e "\x1b[8m Invisible; na na na na boo boo \x1b[m"

Примечание: Вы нужно-e в

echo **-e** "\x1b[35;1m Light purple \x1b[m"

или вам нужно использовать одинарные кавычки. Напечатайте, man echoчтобы понять, почему (двойные кавычки, как правило, являются болью при печати; когда мне нужно, чтобы материал не расширялся, или мне нужны экранирующие последовательности ANSI, я использую одинарные кавычки, потому что это легко - даже несмотря на то, что я привык к этому много раз - забыть -е, в этом случае вы получите « box with numbers and letters[35; 1m»).

Каждый раз, когда вы видите, CSIзамените его "\x1b["(или "\e["или "\u1b["). "\x1b["Я думаю, что это более стандартно, но я не знаю, в чем разница между ними.

Dylan
источник
Если вам нравится загромождать свои строки дополнительными символами, не используйте \ e :-)
clearlight
@clearlight Я не уверен, что вы имеете в виду. Я думаю, что вы могли бы сказать «использовать \ е». Тем не менее, \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-последовательности, которые используют большинство современных терминалов.
Дилан