Ich habe ein Bash-Skript, das ich von Gary Bernhardts Dotfiles erhalten habe und das eine schöne kolorierte Liste der letzten Git-Commits druckt. Mit dem column
Befehl wird die Ausgabe in Spalten angeordnet. Auf meinem Mac funktioniert es wunderbar.
Seltsamerweise funktioniert das Spaltenbit jedoch nicht, wenn ich es unter Cygwin oder CentOS 6 ausführe. Alle Felder haben unabhängig von ihrer Länge drei Zwischenräume, wodurch gezackte Rinnen zwischen "Säulen" entstehen. Ich habe es auf die ANSI-Farb-Escape-Codes eingegrenzt. Wenn ich diese entferne, kommen die Säulen in einer Reihe heraus.
Die zsh-Version ist bei allen drei gleich (und das Problem tritt in bash genauso auf). Ich kann nicht sagen, was die Version von column
ist, aber sie sehen genauso aus und ihre Manpages sind für alles, was es wert ist, gleich.
Warum sollte dies auf meinem Mac funktionieren, aber nicht auf den anderen Betriebssystemen?
Antworten:
column
arbeitet pro Charakter. Es zählt druckbare Zeichen von jeder Zelle und dann Pads , um sie auszurichten (siehe Codequellen für V2.29).Das Problem besteht darin, dass Ihr Stream nicht druckbare ANSI-Escape-Sequenzen enthält, in die druckbare Zeichen eingebettet sind.
column
Dann kann die minimale Breite der realen Zelle dieser Zellen nicht berechnet werden und die nächsten Zellen derselben Zeile werden falsch ausgerichtet.Hier ist ein Beispiel mit dem blauen Farbcode
<esc>[34m
für dieA
Zelle in Spalte v2.29:A
Zelle wird als höhenbedruckbares Zeichen angesehen, solange nur beide Escapezeichen als nicht druckbar erkannt werden. Daher erhält die C-Spalte sieben unerwünschte Auffüllräume.Beachten Sie, dass dieses Verhalten in allen Spaltenversionen nicht konsistent ist. Version 2.26
wcswidth
berechnet die sichtbare Breite der Zellen und führt zu einer anderen Fehlausrichtung.quelle
column
befehlszeilenähnliches Tool, das verschiedene Escape-Sequenzen und andere Sonderzeichen kennt, aber es ist immer möglich, eines zu erstellen. Es ist möglicherweise nicht so einfach, die Zellenbreite einfach gut zu zählen. Beispielsweise muss ein solches Tool möglicherweise über Hintergrundfarbcodes Bescheid wissen, um sie zwischen Zellen zu beenden und erneut zu öffnen. Es muss auch Trennzeichen in diesen Sequenzen überspringen, um sie nicht zu ändern.\010
am Anfang jeder falsch ausgerichteten Zelle Rückräume einzufügen . Also siebenmal am Anfang der D-Zelle in meinem Beispiel :echo '\033[34mA\033[0m B\nC \010\010\010\010\010\010\010D'|column -t
.%x08
.Möglicherweise
column
prüft$TERM
und / oder prüft der Befehl$LANG
, was (wenn überhaupt) einen Farbcode ausmacht.Natürlich können Sie auch zunächst
git log --pretty=format:...
ein spaltenausgerichtetes farbcodiertes Protokoll ausgeben. Zum Beispiel benutzegit hist
und habe ich dies in meinem~/.git/config
:quelle