Ich habe eine Funktion in einem Bash-Skript message_offset
, mit der der Status eines Bash-Skripts gedruckt wird.
Das heißt, Sie würden es als Übergabe einer Nachricht und eines Status wie diesen bezeichnen
message_offset "install font library" "[ OK ]"
und es würde in das Terminal gedruckt, wo printf
das %*s
Format verwendet wird, um immer das Zeichen ganz rechts mit einer [ OK ]
Breite von 80 Spalten festzulegen, z. B. wäre die Ausgabe
install font library [ OK ]
update configuration file on server [ ERR ]
^
|
always
at 80
Wenn echo
verwendet, würde die Ausgabe so aussehen
install font library [ OK ]
update configuration file on server [ ERR ]
Code:
#!/usr/bin/env bash
function message_offset() {
local message="$1"
local status="$2"
# compensate for the message length by reducing the offset
# by the length of the message,
(( offset = 80 - ${#message} ))
# add a $(tput sgr0) to the end to "exit attributes" whether a color was
# set or not
printf "%s%*s%s" "${message}" 80 "$status" "$(tput sgr0)"
}
Dies alles funktioniert in Ordnung, bis ich versuche, tput
einige Farbsequenzen in die Zeichenfolge einzufügen, dh "[ERR]" rot zu machen.
Es scheint, dass die printf "%*s"
Formatierung die tput-Zeichenfolgen zählt, wenn der Offset eingestellt wird. Wenn ich also die Funktion so aufrufe
message_offset "update configuration file on server" "$(tput setaf 1)[ ERR ]"
Die Ausgabe sieht ungefähr so aus:
install font library [ OK ]
update configuration file on server [ ERR ]
weil printf "%*s"
gesagt wird, hey, diese Zeichenfolge hat alle "[ ERR ]"
Zeichen plus die "$(tput setaf 1)
Zeichen, aber offensichtlich werden die "$(tput setaf 1)
Zeichen nicht gedruckt, also beeinflussen Sie die Auffüllung nicht wirklich.
Gibt es eine Möglichkeit, die "Status" -Nachrichten tput
farbig zu gestalten und auch die Stilfarbsequenzen zu verwenden?
%*s
und printf%-*s
ist?$(tput cols)
= Terminalbreite,printf '%-*s' $offset "$1"
druckt die Nachricht linksbündig und füllt sie mit Leerzeichen bis zur Breite nach rechts$offset
. Das ist im Wesentlichen alles, was dazu gehört.printf '%-*s'
ist der Schlüssel hier?printf '%10s|\n' aaa
dannprintf '%-10s|\n' aaa
, dannprintf '%-*s|\n' 10 aaa
%-*s
ist im Wesentlichen "absolute" Polsterung, unabhängig davon, wie lang sie%s
ist, während sie%*s
"relativ zum rechten Rand des vorherigen Wortes" ist. Danke Sato :)ein einfacher Ansatz ist , alles kolorieren nach ihm ausgerichtet wurde
Kurz gesagt, Sie brauchen
Eine Funktion (oder besser ein externes Skript) zum Färben von Zeichenfolgen mit Farben (z. B. mithilfe von Perls
s,$regex,$color$&$resetcolor,gi
und Sie rufen es auf, nachdem Sie den Druck ausgeführt haben. Farb-Escape-Codes ändern die Ausrichtung auf diese Weise nicht.
Beispiel: Nehmen wir an, Sie haben ein Skript mit dem Namen "colorize" erstellt, das Farbargumente verwendet, gefolgt von regulären Ausdrücken, die mit dieser Farbe eingefärbt werden sollen. Beispiel:
colorize -blue 'regex1' -green 'regex2'
Sie nennen es bei Bedarf:Wenn Sie das als Skript für sich haben, können Sie es überall verwenden, zum Beispiel:
quelle