In einem Shell-Skript ...
Wie erfasse ich stdin in einer Variablen, ohne nachfolgende Zeilenumbrüche zu entfernen?
Im Moment habe ich versucht:
var=`cat`
var=`tee`
var=$(tee)
In allen Fällen $varwird nicht die nachfolgende Newline des Eingabestreams angezeigt. Vielen Dank.
AUCH: Wenn die Eingabe keinen nachgestellten Zeilenumbruch enthält, darf die Lösung keinen hinzufügen .
UPDATE IM LICHT DER AKZEPTIERTEN ANTWORT:
Die endgültige Lösung, die ich in meinem Code verwendet habe, lautet wie folgt:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Wenn Sie den vollständigen Code sehen möchten, besuchen Sie bitte die Github-Seite für expandr , ein kleines Open-Source -Filter- Shell-Skript zur Erweiterung von Git-Schlüsselwörtern , das ich aus Gründen der Informationssicherheit entwickelt habe. Gemäß den Regeln, die in .gitattributes- Dateien (die branchenspezifisch sein können) und in git config festgelegt sind , leitet git jede Datei beim Ein- und Auschecken aus dem Repository durch das Shell-Skript expandr.sh . (Aus diesem Grund war es wichtig, nachfolgende oder fehlende Zeilenumbrüche beizubehalten.) Auf diese Weise können Sie vertrauliche Informationen bereinigen und verschiedene Sätze umgebungsspezifischer Werte für Test-, Staging- und Live-Zweige austauschen.
filter, werden an den Enden von Eingabestreams, die ursprünglich nicht in Zeilenumbrüchen endeten, Zeilenumbrüche hinzugefügt. Eigentlich habe ich es nur getan filter, bin aber auf dieses Problem gestoßen, das mich zu dieser Lösung geführt hat, weil weder "immer neue Zeilen hinzufügen" noch "immer neue Zeilen entfernen" akzeptable Lösungen sind.
sedwird wahrscheinlich die zusätzliche Zeilenumbruch machen - aber Sie sollten das filternicht mit allen anderen erledigen . Und all diese Funktionen, die Sie haben, tun im Grunde das Gleiche - a sed s///. Sie verwenden die Shell, um Daten, die sie in ihrem Speicher gespeichert hat sed, sedweiterzuleiten, damit diese Daten möglicherweise durch andere Daten ersetzt werden, die die Shell in ihrem Speicher gespeichert hat, damit sedsie an die Shell zurückgeleitet werden können. Warum nicht einfach [ "$var" = "$condition" ] && var=new_value? Ich bekomme die Arrays auch nicht - speichern Sie den Array-Namen in und verwenden Sie ihn [0]dann sed, um ihn durch den Wert in zu ersetzen [1]? Vielleicht chatten?
filter? Es funktioniert perfekt wie es ist. In Bezug darauf, wie der Code unter meinem Link funktioniert und warum ich ihn so eingerichtet habe, wie ich es getan habe, lassen Sie uns in einem Chatroom darüber sprechen.
filterdauertstdin- es läuftsed. Sie fangenstdinin$GIT_INPUTdann das zurück druckenstdoutüber ein Rohrfilterund seine fangenstdoutin$FILTERED_OUTPUTund es dann drucken zurückstdout. Alle 4 Zeilen am Ende Ihres obigen Beispiels könnten durch Folgendes ersetzt werden :filter. Hier ist nichts für ungut gemeint, es ist nur ... du arbeitest zu hart. Sie brauchen die Shell-Variablen die meiste Zeit nicht - leiten Sie die Eingabe einfach an die richtige Stelle und geben Sie sie weiter.