Змінення шрифту в команді 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_

Зазвичай ви не можете змінити розмір шрифту. Єдине, що ви зазвичай можете зробити, - це зміни кольору, а іноді і жирний / підкреслений атрибут. Для цього можна використовувати послідовності втечі ANSI. Див. Наприклад, bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html для деяких прикладів.
— jofel

Відповіді:


15

У більшості, якщо не у всіх терміналах емуляторів, ви не можете встановити різні розміри шрифту або різні шрифти, лише кольори та кілька атрибутів (жирний, підкреслений, виділений).

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


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"

і з коментарів, подяки маніпулювання та GypsyCosmonaut:

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

і не знаю різниці між io-std і нормальним.

Я не бачив у шкаралупі курсивом або малим.

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

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

echo -e "\x1b[1m bold"

в bash, або шестигранному редакторі.


1
Символи втечі можуть бути набрані: Ctrl + V, Esc. (Буде відображатися як "^ [". Це означає, що вся послідовність ANSI матиме вигляд "^ [[1mbold". ")
— манатура

1
Можна згадати більше атрибутів: \e[4mпідкреслений, \e[5mмиготливий, \e[7mперевернутий.
— манатство

@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; 1м").

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


Якщо вам подобається захаращувати свої струни додатковими символами, не використовуйте \ e :-)
— clearlight

@clearlight Я не впевнений, що ти маєш на увазі. Я думаю, ви, можливо, мали намір сказати "використовувати \ e". Однак \eвін менш підтримуваний, ніж \x1bя знайшов. Оптимальним, що можна зробити, було б esc=$'\e'або esc=$'\x1b'(це в басі), а потім використовувати "${esc}[34;1m"(наприклад, яскраво-синій). У мене є напівскладний приклад тут ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) за справжній рядок ;) Будь ласка, пробачте ім’я репо - ви можете подякувати людям у каналі freenode # archlinux-offtopic для цього.
— Ділан

Причина цього esc=$'\e'полягає в тому, що це дозволяє bash створювати персонаж ансі-втечі на місці, і ви отримуєте користь від нього двома способами. Іноді, насправді (як це показано в посиланні github), вам доводиться використовувати цей метод для того, щоб колір відображався належним чином. Для старих версій bash, а також оболонки sh, ви повинні (але не потрібно) використовувати цей метод, щоб отримати колір, щоб показати ... надано, що термінал використовує послідовності евакуації, як це робить більшість сучасних терміналів.
— Ділан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.