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.
Odpowiedzi:
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).
CSI
jestESC [
napisane$'\e['
bash. Sekwencja zmiany znaczenia do zmiany atrybutów toCSI Ps m
.Zsh ma do tego wygodną funkcję .
źródło
Możesz dołączyć te definicje kolorów do skryptu lub pliku źródłowego. Może wyglądać mniej więcej tak.
Zauważ, że powinieneś resetować kody kolorów ANSI po każdym wywołaniu zmiany. W
tput sgr0
resetuje 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ć.
źródło
Wygląda na to, że układ nie może obsłużyć
[0x1b]
znaku -z przodu[
.Pierwsza linia jest pogrubiona:
Jeśli chodzi o typ ogólny, wiem tylko
i z komentarzy, dzięki manatwork i GypsyCosmonaut:
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 bold
lub^[[1mbold
(aby uniknąć spacji przed „pogrubieniem”).Wielu redaktorów ma problemy z (char) 0x1b. Alternatywy: skopiuj / wklej skądś lub użyj
w bash lub edytorze szesnastkowym.
źródło
\e[4m
podkreślone,\e[5m
migające,\e[7m
odwrócone.echo -e "\x1b[3m italic"
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:
Uwaga: Możesz potrzebować
-e
wlub musisz użyć pojedynczych cudzysłowów. Wpisz,
man echo
aby 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,
CSI
zamień 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.źródło
\e
mniej obsługiwany niż\x1b
znalazłem. Optymalną rzeczą do zrobienia byłoby alboesc=$'\e'
alboesc=$'\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.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.