So fügen Sie Tabulatoren vor den Ausgabezeilen eines ausgeführten Befehls ein

16

Nur eine kurze Frage. Ist es möglich, die Ausgabe auf Ubuntu 16.04 LTS zu tabulieren? Ich habe unten zwei Bilder erstellt, um zu veranschaulichen, was ich damit meine.

img1

img2

Alex Ng
quelle
1
Wäre es in Ordnung, wenn Sie die Befehlsausgabe durch einen anderen Befehl leiten müssten wie YOUR COMMAND | indentoder wenn Sie einen anderen Befehl davor eingeben müssten (könnte sogar nur ein Unterstrich sein) wie _ YOUR COMMAND?
Byte Commander
1
@ByteCommander Das habe ich mir überlegt, aber ich mache das aus Gründen der Benutzerfreundlichkeit und um die Konsolenausgabe besser lesbar zu machen. Daher denke ich nicht, dass es die Lösung ist, alle meine Befehle weiterzuleiten. Vielen Dank für die Antwort und bearbeiten!
Alex Ng
1
[Bitte posten Sie keine Screenshots der Textausgabe. ] ( meta.askubuntu.com/q/8713/85695 )
terdon

Antworten:

15

Sie könnten so etwas tun - mit Dateideskriptoren:

  1. Speichern Sie den aktuellen Ausgabedeskriptor, damit wir ihn später wiederherstellen können

    exec 3>&1
  2. Leiten Sie den Ausgabestream an eine Prozessersetzung weiter , die die Registerkarte einfügt - zum Beispiel

    exec 1> >(paste /dev/null -)

Ab diesem Zeitpunkt wird bei jedem Prozess, der in die Standardausgabe schreibt, diese Ausgabe durch den pasteBefehl zum Einfügen von Registerkarten am Anfang "gefiltert" .

  1. Wenn Sie fertig sind, können Sie das normale Verhalten wieder aufnehmen, indem Sie den gespeicherten Dateideskriptor wiederherstellen und den temporären schließen

    exec 1>&3 3>&-
Stahlfahrer
quelle
Ich möchte mich für die Antwort bedanken. Dies ist die Lösung, die mir am nächsten gekommen ist, obwohl sie nicht perfekt ist.
Alex Ng
@AlexNg danke für das upvote - inwiefern macht es konkret nicht das, wonach du gefragt hast? Wenn Sie mich wissen lassen, werde ich versuchen, es zu verbessern
Steeldriver
Um ein paar Beispiele zu nennen: Nach der Eingabe Ihrer Befehle funktionieren einige Befehle wie 'php -v', 'hostname' und andere wie vorgesehen. Wenn Sie jedoch einen Befehl wie 'echo Hello World' verwenden, wird die Ausgabe parallel zur Eingabe angezeigt und wirkt sich auch nachteilig auf die visuelle Darstellung der Eingabe aus, wenn Sie den nächsten Befehl eingeben. Einige andere Befehle werden ebenfalls nicht vom Tabulatorvorgang beeinflusst, z. B. bei der Eingabe eines ungültigen Befehls wie 'asdasd'.
Alex Ng
Schließlich wird die geänderte Ausgabe nicht korrekt angezeigt (nicht sicher, wie dies richtig beschrieben werden soll, entschuldigt sich). Wenn zum Beispiel der Befehl 'apt-get update' verwendet wird, gibt es beim Vergleich mit einer Konsole ohne Tabbing-Prozess deutliche Unterschiede.
Alex Ng
Das Problem ist, dass dieser Ansatz nur STDOUT (Stream 1), nicht jedoch STDERR (Stream 2) verarbeitet. Es unterbricht auch die Ausgabe von Programmen, die lessoder ähnliche Tools verwenden, um das Scrollen der Ausgabe zu ermöglichen, wie z man.
Byte Commander
9

Ich verstehe, dass diese Antwort für Sie nicht optimal ist, aber Sie könnten eine Bash-Funktion mit dem einfachen Namen _(oder etwas anderem, das noch nicht verwendet wird) erstellen, die den Befehl ausführt, den sie als Argumente erhält, und die gesamte Ausgabe mit einem Tabulator einrückt.

Ein Beispiel:

$ _ lsb_release -a
        No LSB modules are available.
        Distributor ID: Ubuntu
        Description:    Ubuntu 16.04 LTS
        Release:    16.04
        Codename:   xenial

Der Code dieser Funktion wäre nur:

_(){ sed "s/^/\t/" <($*); }

Sie können es an Ihre ~/.bashrcDatei anhängen, damit es in allen Bash-Sitzungen Ihres Benutzers verfügbar ist, indem Sie Folgendes ausführen:

echo '_(){ sed "s/^/\t/" <($*); }' >> ~/.bashrc

Wenn Sie es allen Benutzern zur Verfügung stellen möchten, fügen Sie es /etc/bash.bashrcstattdessen an (erfordert Administratorrechte):

echo '_(){ sed "s/^/\t/" <($*); }' | sudo tee -a /etc/bash.bashrc

Alternativ können Sie auch eine Skriptdatei /usr/local/bin/_mit folgendem Inhalt erstellen , um dies auch ohne Bash-Funktionen und für alle Benutzer zu erreichen:

#!/bin/bash
sed "s/^/\t/" <($*)

Sie müssen das Skript nach dem Speichern der Datei mit ausführbar machen

sudo chmod +x /usr/local/bin/_
Byte Commander
quelle
5

Mit echokönnen Sie Backslash-Escapes wie \teinen Tabulator mit dem -eSchalter interpretieren lassen :

echo -e "\tHello World"

Aber es wäre kaum machbar (oder wahrscheinlich möglich), die Ausgabe jedes Befehls auf diese Weise zu ändern. Wenn Sie das Lesen erleichtern möchten, sollten Sie das Aussehen (z. B. die Farbe) Ihrer Eingabeaufforderung wie folgt anpassen:

Sie können Ihre Eingabeaufforderung anpassen, indem Sie den Inhalt der Umgebungsvariablen ändern PS1. Ein kleines Beispiel dafür finden Sie im Blog-Beitrag, aus dem der obige Screenshot stammt. Die detaillierte Verwendung dieser sogenannten ANSI-Escape-Sequenzen, die Verwendung komfortablerer Tools, die Standardanwendung der Änderungen in neuen Terminals usw. sind nicht Gegenstand dieser Antwort. Wenn Sie sich jedoch für diese Technik entscheiden, finden Sie im Internet zahlreiche Tutorials und weitere Informationen.

Henning Kockerbeck
quelle
Vielen Dank für die Rückmeldung, allerdings habe ich PS1 bereits nach meinen Wünschen geändert.
Alex Ng