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