Für viele Artikel (wie zum Beispiel diesen hier ;) ist es praktisch die Ausgabe von Shellcommandos sauber formatiert auf der Webseite darstellen zu können. Man könnte natürlich Screenshots machen, aber die JPEGs sind verwaschen, verschwenden Bandbreite und sind für Suchmaschienen nicht interpretierbar.
Viel besser ist es den Text schön mit HTML Tags formatiert darzustellen. Allerdings wird es auf Dauer etwas anstrengend die Ausgaben per Hand mit HTML Tags zu formatieren. Ein Weg zur automatisierten Umwandlung von Bash Escape Codes in HTML Tags muss also her ;)
Um das Ganze hinzukriegen habe ich zwei Skripte geschrieben:
Eines um die Ausgaben eines Kommandos inklusive der Bash Escape Codes in eine Datei zu loggen und ein zweites um diese in HTML Tags zu übersetzen.
Das Loggen der Ausgabe wird vom record-Skript ausgeführt, da ein direktes Umleiten in eine Datei die nötigen Bash Escape Codes wegfiltern würde (nur eine Shell bekommt die Escape Codes wirklich zur Anzeige übermittelt).
Die Übersetzung der Escape Codes in HTML Tags wird von bash2html ausgeführt, was eigentlich nur ein nettes Wrapper Skript für einen sed-Aufruf darstellt. Alle Ersetzungsoperationen werden im zugehörigen sed-Skript bash2html.sed vorgenommen.
Der gesamte Block wird in <pre class=”console”></pre> Tags eingeschlossen und kann per CSS formatiert werden. Einzelne Textteile erhalten ihre Vorder- bzw. Hintergrundfarbe über <span style=”color: foo; background-color: bar;”></span> Tags, wobei bei schwarzem Hintergrund in der Konsole keine background-color im style-Tag definiert wird.
1. Ausgabe eines Befehls mit record Skript loggen
acer /var # ~/record 'ls --color' ~/test.log cache db empty gdm lib lock log lost+found mail run spool state tmp www
Die Ausgabe inklusiver Bash Escape Codes ist nun in ~/test.log zu finden:
^[[00m^[[01;34mcache^[[00m ^[[01;34mdb^[[00m ^[[01;34mempty^[[00m ^[[37;44mgdm^[[00m ^[[01;34mlib^[[00m ^[[01;34mlock^[[00m ^[[01;34mlog^[[00m ^[[01;34mlost+found^[[00m ^[[01;36mmail^[[00m ^[[01;34mrun^[[00m ^[[01;34mspool^[[00m ^[[01;34mstate^[[00m ^[[30;42mtmp^[[00m ^[[01;34mwww^[[00m ^[[m
2. Die geloggte Ausgabe in HTML umwandeln
acer ~ # ./bash2html test.log Using sed filter script from '/home/floeffler/scripts/bash2html.sed'. Processing...done. <pre class="console"> <span style="color: Blue;">cache</span> <span style="color: Blue;">db</span> <span style="color: Blue;">empty</span> <span style="color: Silver; background-color: Blue;">gdm</span> <span style="color: Blue;">lib</span> <span style="color: Blue;">lock</span> <span style="color: Blue;">log</span> <span style="color: Blue;">lost+found</span> <span style="color: Aqua;">mail</span> <span style="color: Blue;">run</span> <span style="color: Blue;">spool</span> <span style="color: Blue;">state</span> <span style="color: Black; background-color: Lime;">tmp</span> <span style="color: Blue;">www</span> </pre> Result also saved to 'test.log.html'. done.
Die obige HTML-formatierte Ausgabe ist nun ebenso in der Datei test.log.html zu finden.
Standardmäßig wird an die Eingabedatei einfach ein .html angehängt, um die Ausgabedatei zu erhalten. Das Skript unterstützt aber einige Optionen, um dieses Verhalten zu beeinflussen (siehe bash2html -h).
3. Anmerkungen
Zwei Sachen bleiben noch anzumerken:
- ^[ ist die Darstellung für das Bash Escape Zeichen und leitet die Escape Sequenz ein. Obwohl die Repräsentation so erscheint als wären es zwei Zeichen ist es tatsächlch nur ein einzelnes und kann in Strings durch /033 mit seinem ASCII Code ausgeben oder direkt über die Tastatur mit ALT + v und danach ESC eingegeben werden. Ein copy and paste der obigen Zeichen wird nicht funktionieren, da ^[ als zwei einzelne Zeichen kopiert würden.
- Die gesamte Umwandlung findet im sed-Skript bash2html.sed statt und erhebt zum derzeitigen Stand keinen Anspruch auf Vollständigkeit oder gar Korrektheit. Die momentane Version ist nur eine schnelle Minimallösung und funktionierte für meine Anwendungsfälle bisher zufriedenstellend.
Anregungen und Erfahrungsberichte sind natürlich wie immer erwünscht ;)
Have fun!
|
| 07.01.2008 22:29:00 |
|
| 07.01.2008 22:29:17 |
|
| 07.01.2008 22:29:18 |
