Zmień czcionkę w poleceniu echo


16

Czy można zmienić atrybuty czcionki wyjściowej echa w Zsh lub Bash?

Chciałbym coś podobnego do:

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".

tak, aby wydrukować: „To jest czcionka: normalna, kursywa , pogrubiona , mała ” w linii tekstu.


Ma to więcej wspólnego z danym emulatorem terminala niż z używaną powłoką. Myślę, że ten wątek zawiera cenne wskazówki
sr_

Zwykle nie można zmienić rozmiaru czcionki. Jedyne, co zwykle możesz zrobić, to zmienić kolor, a czasem atrybut pogrubiony / podkreślony. W tym celu można użyć sekwencji ucieczki ANSI. Zobacz np. Bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html, aby zobaczyć kilka przykładów.
jofel,

Odpowiedzi:


15

W większości, jeśli nie we wszystkich emulatorach terminali, nie można ustawić różnych rozmiarów czcionek lub różnych czcionek, tylko kolory i kilka atrybutów (pogrubienie, podkreślenie, wyróżnienie).

W bash (lub w Zsh lub innej powłoce) możesz bezpośrednio używać sekwencji ucieczki terminalu (poza kilkoma egzotycznymi, wszystkie terminale podążają teraz za xterm). CSIjest ESC [napisane $'\e['bash. Sekwencja zmiany znaczenia do zmiany atrybutów to CSI Ps m.

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

Zsh ma do tego wygodną funkcję .

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined

16

Możesz dołączyć te definicje kolorów do skryptu lub pliku źródłowego. Może wyglądać mniej więcej tak.

#!/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

Zauważ, że powinieneś resetować kody kolorów ANSI po każdym wywołaniu zmiany. W tput sgr0resetuje wszystkie zmiany dokonane w terminalu.

Uważam, że zmiana rozmiaru czcionki lub kursywy byłaby specyficzna dla używanego terminala.

Chociaż ten przewodnik jest dostosowany do dostosowywania zachęty do bash, jest dobrym źródłem kodów kolorów i generuje pewne pomysły na to, co możesz zrobić.


5

Wygląda na to, że układ nie może obsłużyć [0x1b]znaku -z przodu [.

Pierwsza linia jest pogrubiona:

 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"   

Jeśli chodzi o typ ogólny, wiem tylko

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

i z komentarzy, dzięki manatwork i GypsyCosmonaut:

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

i nie znam różnicy między io-std a normalnym.

W skorupce nie widziałem kursywy ani małych znaków.

Możesz wprowadzić je (również dzięki manatwork) przez Ctrl + v ESC w Bash, gdzie będzie wyświetlany jako ^[. Oznacza to, że cała sekwencja ANSI będzie wyglądać jak ^[[1m boldlub ^[[1mbold(aby uniknąć spacji przed „pogrubieniem”).

Wielu redaktorów ma problemy z (char) 0x1b. Alternatywy: skopiuj / wklej skądś lub użyj

echo -e "\x1b[1m bold"

w bash lub edytorze szesnastkowym.


1
Znaki specjalne można wpisać: Ctrl + V, Esc. (Będzie wyświetlany jako „^ [”. Oznacza to, że cała sekwencja ANSI będzie wyglądać jak „^ [[1mbold”.)
manatwork

1
Jest więcej atrybutów do wspomnienia: \e[4mpodkreślone, \e[5mmigające, \e[7modwrócone.
manatwork

@manatwork: dodał je.
użytkownik nieznany

@userunknown Dzięki za pomoc, majsterkowanie przy kodzie, znalazłem kursywęecho -e "\x1b[3m italic"
GypsyCosmonaut

0

Tutaj:

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

(uwaga: wiele z nich zwykle nie działa, ale większość z nich jest oznaczona w ten sposób).

Tworzę grę w terminalu i polegam w dużej mierze na powyższym linku. Mówi nawet, jak ukryć / odkryć kursor, zrobić kolor (30 lat), „pogrubiony” (jaśniejszy), ciemniejszy, podkreślony, kursywę, kolor tła (40 zamiast 30), itp. Możesz także zmienić położenie kursora ( co jest bardzo pomocne - na przykład "\x1B[1A"przesuwa kursor o jedną linię w górę; "\x1B[0;0H"przesuwa kursor do wiersza 0, col 0; "\x1B[2J"czyści ekran; "\x1B[2K"czyści linię.

Do twoich celów, jak ludzie powiedzieli:

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"

Uwaga: Możesz potrzebować-e w

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

lub musisz użyć pojedynczych cudzysłowów. Wpisz, man echoaby zobaczyć, dlaczego (podwójne cudzysłowy są zwykle uciążliwe podczas drukowania; kiedy potrzebuję rzeczy, by się nie rozszerzać lub potrzebuję sekwencji ucieczki ANSI, używam pojedynczych cudzysłowów, ponieważ jest to łatwe - mimo że przyzwyczaiłem się do tego, robiąc to tyle razy - aby zapomnieć o -e, w którym to przypadku dostajesz „ box with numbers and letters[35; 1m”).

Za każdym razem, gdy zobaczysz, CSIzamień go na "\x1b["(lub "\e["lub "\u1b["). "\x1b["Myślę, że jest bardziej standardowy, ale tak naprawdę nie wiem, jaka jest między nimi różnica.


Jeśli lubisz zaśmiecać ciągi dodatkowymi znakami, nie używaj \ e :-)
wyczyść

@ Clearlight Nie jestem pewien, co masz na myśli. Myślę, że mogłeś powiedzieć „use \ e”. Jest jednak \emniej obsługiwany niż \x1bznalazłem. Optymalną rzeczą do zrobienia byłoby albo esc=$'\e'albo esc=$'\x1b'(to jest bash), a następnie użycie "${esc}[34;1m"(dla, na przykład, jasnoniebieskiego). Mam tutaj częściowo złożony przykład ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) dla prawdziwego ciągu zachęty do bash;) Proszę wybaczyć nazwę repo - możesz podziękować ludziom na kanale freenode # archlinux-offtopic do tego.
Dylan

Powodem tego esc=$'\e'jest to, że pozwala to bashowi stworzyć postać ansi-ucieczki na miejscu i możesz z niej skorzystać na kilka sposobów. Zdarza się, że w rzeczywistości (jak wykazano w linku github), użytkownik ma do wykorzystania tej metody w celu uzyskania koloru, aby pokazać się prawidłowo. W przypadku starszych wersji bash, a także powłoki sh, powinieneś (ale nie trzeba) korzystać z tej metody, aby wyświetlać kolory ... pod warunkiem, że terminal używa sekwencji specjalnych, które robią większość współczesnych terminali.
Dylan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.