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 $var
wird 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.
sed
wird wahrscheinlich die zusätzliche Zeilenumbruch machen - aber Sie sollten das filter
nicht 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
, sed
weiterzuleiten, damit diese Daten möglicherweise durch andere Daten ersetzt werden, die die Shell in ihrem Speicher gespeichert hat, damit sed
sie 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.
filter
dauertstdin
- es läuftsed
. Sie fangenstdin
in$GIT_INPUT
dann das zurück druckenstdout
über ein Rohrfilter
und seine fangenstdout
in$FILTERED_OUTPUT
und 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.