Ändern Sie die Schriftart im Echo-Befehl

16

Ist es möglich, die Schriftattribute der Ausgabe von echo in zsh oder bash zu ändern?

Was ich möchte, ist etwas Ähnliches wie:

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

so dass es gedruckt wird: "Dies ist die Schriftart: normal, kursiv , fett , klein " innerhalb einer Textzeile.

Sardathrion - Setzen Sie Monica wieder ein
quelle
Dies hat mehr mit dem betreffenden Terminalemulator zu tun als mit der verwendeten Shell. Dieser
Fragenthread
Normalerweise können Sie die Schriftgröße nicht ändern. Das Einzige, was Sie normalerweise tun können, ist das Ändern der Farbe und manchmal des Attributs Fett / Unterstrichen. Hierfür können Sie ANSI-Escape-Sequenzen verwenden. Siehe zB bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html für einige Beispiele.
Jofel

Antworten:

15

Auf den meisten, wenn nicht allen Terminalemulatoren können Sie keine unterschiedlichen Schriftgrößen oder Schriftarten, nur Farben und einige Attribute (fett, unterstrichen, hervorgehoben) festlegen.

In bash (oder in zsh oder einer anderen Shell) können Sie die terminalen Escape-Sequenzen direkt verwenden (bis auf einige exotische folgen heutzutage alle Terminals den Anweisungen von xterm). CSIist ESC [, $'\e['in Bash geschrieben. Die Escape-Reihenfolge zum Ändern von Attributen lautet CSI Ps m.

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

Zsh hat dafür eine bequeme Funktion .

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined
Gilles 'SO - hör auf böse zu sein'
quelle
16

Sie können diese Farbdefinitionen in ein Skript oder eine Quelldatei einfügen. Könnte ungefähr so ​​aussehen.

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

Beachten Sie, dass Sie die ANSI-Farbcodes nach jedem Aufrufen einer Änderung zurücksetzen sollten. Das tput sgr0setzt alle Änderungen zurück, die Sie im Terminal vorgenommen haben.

Ich glaube, dass das Ändern der Schriftgröße oder der Kursivschrift spezifisch für das von Ihnen verwendete Terminal ist.

Während dieses Handbuch speziell für das Anpassen Ihrer Bash-Eingabeaufforderung gedacht ist, ist es eine gute Referenz für Farbcodes und generiert einige Ideen für mögliche Aktionen.

George M
quelle
5

Scheint so, als ob das Layout das [0x1b]-Zeichen vor dem nicht verarbeiten kann [.

Die erste Zeile macht fett:

 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"   

Für den allgemeinen Typ weiß ich nur

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

und aus den Kommentaren, danke manatwork und GypsyCosmonaut:

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

und kenne den Unterschied zwischen io-std und normal nicht.

Ich habe weder Kursiv noch Klein in der Shell gesehen.

Sie können sie (auch dank Handarbeit) mit Ctrl + v ESC in den Bash eingeben , wo sie als angezeigt werden ^[. Dies bedeutet, dass die gesamte ANSI-Sequenz wie ^[[1m boldoder aussieht ^[[1mbold(um das Leerzeichen vor "fett" zu vermeiden).

Viele Editoren haben Probleme mit (char) 0x1b. Alternativen: Kopieren / Einfügen von irgendwoher oder Verwenden

echo -e "\x1b[1m bold"

in Bash oder einem Hex-Editor.

Benutzer unbekannt
quelle
1
Escape-Zeichen können eingegeben werden: Strg + V, Esc. (Wird als "^ [" angezeigt. Dies bedeutet, dass die gesamte ANSI-Sequenz wie "^ [[1MBold" aussieht.)
manatwork
1
Es gibt weitere Attribute zu erwähnen: \e[4munterstrichen, \e[5mblinkend, \e[7minvertiert.
Handarbeit
@manatwork: hat sie hinzugefügt.
Benutzer unbekannt
@userunknown Vielen Dank, dass Sie geholfen haben und an Ihrem Code echo -e "\x1b[3m italic"
herumgebastelt haben.
0

Hier:

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

(Hinweis: Viele von ihnen funktionieren normalerweise nicht, die meisten sind jedoch so gekennzeichnet.)

Ich mache ein Spiel im Terminal und habe mich stark auf den obigen Link verlassen. Hier erfahren Sie sogar, wie Sie den Cursor ein- und ausblenden, Farbe (30er), "Fett" (heller), dunkler, unterstrichen, kursiv, Hintergrundfarbe (40er statt 30er) usw. festlegen können. Sie können auch die Position des Cursors ändern ( Das ist sehr hilfreich. Bewegt beispielsweise "\x1B[1A"den Cursor eine Zeile nach oben, "\x1B[0;0H"bewegt den Cursor auf Zeile 0, Spalte 0, "\x1B[2J"löscht den Bildschirm und "\x1B[2K"löscht die Zeile.

Für Ihre Zwecke, wie die Leute gesagt haben:

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"

Hinweis: Sie benötigen den -ein

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

oder Sie müssen einfache Anführungszeichen verwenden. Geben Sie ein, um man echozu sehen, warum (doppelte Anführungszeichen sind normalerweise ein Problem beim Drucken; wenn ich benötige, dass Inhalte nicht erweitert werden, oder wenn ich ANSI-Escape-Sequenzen benötige, verwende ich einfache Anführungszeichen, obwohl ich mich so oft daran gewöhnt habe - um das -e zu vergessen. In diesem Fall erhalten Sie " box with numbers and letters[35; 1m").

Jedes Mal, wenn Sie es sehen, CSIersetzen Sie es durch "\x1b["(oder "\e["oder "\u1b["). "\x1b["Ich denke, es ist mehr Standard, aber ich weiß nicht wirklich, was der Unterschied zwischen ihnen ist.

Dylan
quelle
Wenn Sie Ihre Saiten gerne mit zusätzlichen Zeichen
überladen
@clearlight Ich bin mir nicht sicher, was du meinst. Ich denke, Sie hätten vielleicht sagen wollen "use \ e". Wird \eaber weniger unterstützt als \x1bich gefunden habe. Das Optimalste wäre entweder esc=$'\e'oder esc=$'\x1b'(dies ist in Bash) und dann "${esc}[34;1m"(für z. B. hellblau). Ich habe hier ein halbkomplexes Beispiel ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) für einen echten Bash-Prompt-String. Archlinux-offtopic dafür.
Dylan
Grund dafür esc=$'\e'ist, dass bash den Ansi-Escape-Charakter an Ort und Stelle erstellen kann und Sie auf verschiedene Arten davon profitieren. Manchmal in der Tat (wie im Github Link gezeigt wird), Sie haben auf diese Methode verwenden , um Farbe zu erhalten , richtig zu zeigen. Für ältere Versionen von bash sowie für die sh-Shell sollten Sie diese Methode verwenden (aber nicht müssen), um Farbe anzuzeigen ... vorausgesetzt, das Terminal verwendet die Escape-Sequenzen, die die meisten modernen Terminals verwenden.
Dylan