Einrücken einer mehrzeiligen Ausgabe in einem Shell-Skript

76

Ich versuche, die Nachricht des Tages (MOTD) auf meiner Ubuntu Amazon EC2-Box so zu ändern, dass sie den Git-Status eines meiner Verzeichnisse anzeigt, wenn ich SSH einnehme.

Die Ausgabe aller Standard-MOTD-Dateien hat am Anfang jeder Zeile zwei Leerzeichen, sodass sie gut eingerückt aussieht. Da meine git statusAusgabe jedoch mehrere Zeilen umfasst, echo -n " "wird nur die erste Zeile eingerückt .

Irgendeine Idee, wie ich es schaffen kann, jede Zeile einzurücken?

Matt Fletcher
quelle

Antworten:

124

Pipe es an sed, um 2 Leerzeichen am Anfang jeder Zeile einzufügen.

git status | sed 's/^/  /'
Barmar
quelle
Ich habe keine Ahnung, wie ich das umgehen soll, aber es gibt ein kleines Problem damit. Der Exit-Code der Funktion wird zerstört, sedwodurch in einigen Fällen ein Problem auftreten kann.
cglacet
@cglacet Das stimmt immer dann, wenn Sie einen Befehl an einen anderen weiterleiten. Wenn es ein Problem ist, leiten Sie die Ausgabe in eine Datei oder Variable um, testen den Beendigungsstatus und verarbeiten dann die gespeicherte Ausgabe.
Barmar vor
@cglacet Wenn Sie set -euo pipefailin der zweiten Zeile Ihres Skripts angeben, wird es für Sie getestet.
Acumenus
44

Aufbauend auf der Antwort von @ Barmar ist dies eine übersichtlichere Methode:

indent() { sed 's/^/  /'; }

git status | indent
other_command | indent
Marplesoft
quelle
1
Fügt nicht wirklich viel hinzu, es war ein One-Use-Fall in einem Shell-Skript und so sind Bash-Subroutinen ein bisschen übertrieben, aber danke
Matt Fletcher
2
@MattFletcher: Nun, ich denke, dass das Schreiben von Code mit Unterprogrammen wie diesem es Nicht-Bash-Profis (wie mir) leichter macht, herauszufinden, was los ist. Wenn Sie sich entschieden haben, plötzlich 3 statt 2 Leerzeichen zu haben, müssen Sie nur einen Ort korrigieren.
Vering
2
@Vering das stimmt, und ich verstehe die Vorteile von solchen, ich habe nur eher vorgeschlagen, dass es eher ein Kommentar als eine Antwort selbst gewesen sein könnte, da es so ziemlich die gleiche Antwort ist und ein Problem anspricht, das nie in der erster Platz :)
Matt Fletcher
@ MattFletcher: OK, Sie könnten einen Punkt über Kommentar vs. Antwort haben
Vering
3
Denken Sie daran, dass ich ein alternatives Code-Snippet bereitgestellt habe. Das ist nicht ideal, um in einem Kommentar ohne Code-Formatierung darzustellen. Wenn ich nur ein oder zwei Sätze zu der vorhandenen Antwort abgegeben hätte, wäre dies für mich als Kommentar angemessener gewesen.
Marplesoft
9

Dank @Barmar und @Marplesoft für einige nette einfache Lösungen - hier ist eine weitere Variante, die anderen gefallen könnte - eine Funktion, mit der Sie feststellen können, wie viele Einrückungsstufen verwendet werden pr:

indent() {
  local indentSize=2
  local indent=1
  if [ -n "$1" ]; then indent=$1; fi
  pr -to $(($indent * $indentSize))
}

# Example usage
ls -al | indent
git status | indent 2
Oliver Dungey
quelle
2
Gute Antwort. FWIW, '$' ist innen nicht notwendig ((...)). Siehe github.com/koalaman/shellcheck/wiki/SC2004
jblaine
Gibt es überhaupt eine Möglichkeit, diese Arbeit mit Bash-Farbfluchten zu machen?
Schlitten
@Sled Falls lsSie die --color=alwaysOption verwenden können : ls -al --color=always | indent. Quelle: dieser StackExchange-Thread
Archangel1C