Gibt es eine Möglichkeit, Bash zu veranlassen, keine Zeilenumbrüche in der Backtick-Ersetzung zu essen?
Beispielsweise:
var=`echo line one && echo line two`
echo $var
line one line two
Was ich will ist
var=`echo line one && echo line two` # plus some magic
echo $var
line one
line two
bash
führt Parameter Expansion vor der Ausführung eines Befehls unter Angabe ist notwendig , um zu informieren ,bash
dass Sie einen einzelnen String drucken möchten , und nicht 4 Worte (line
,one
,line
undtwo
). Versuchen Sie:echo a <many spaces> b
undecho "a <many spaces> b"
. Schauen Sie sich auch diese Antwort an .Auch wenn @cyrus richtig ist - es beantwortet nicht die ganze Frage und es gibt keine Erklärung dafür, was passiert.
Lass uns also durchgehen.
Zeilenumbrüche in Zeichenfolge
Bestimmen Sie zunächst die zu erwartende Bytereihenfolge:
Verwenden Sie jetzt Command Substitution (Abschnitt 3.5.4), um zu versuchen, diese Byte-Sequenz zu erfassen:
Führen Sie dann ein einfaches Echo durch, um die Bytesequenz zu überprüfen:
Es scheint also, dass die erste Zeile durch ein Leerzeichen ersetzt wurde und die zweite Zeile intakt blieb. Aber wieso ?
Schauen wir uns an, was hier tatsächlich passiert:
Zunächst führt bash die Shell-Parametererweiterung aus (Abschnitt 3.5.3).
Dann führt bash die Wortteilung durch (Abschnitt 3.5.7)
Als nächstes behandelt bash es als einfachen Befehl (Abschnitt 3.2.1)
Die Definition von Leerzeichen (Abschnitt 2 - Definitionen)
Schließlich ruft bash den internen Befehl echo (Abschnitt 4.2 - Bash Builtin Commands) auf
Zusammenfassend werden die Zeilenumbrüche durch Word Splitting entfernt, und das Echo erhält zwei Argumente, "a" und "b", und gibt sie dann getrennt durch Leerzeichen aus und endet mit einem Zeilenumbruch.
Wenn Sie das tun, was @cyrus vorgeschlagen hat (und die Newline von Echo mit -n unterdrücken), ist das Ergebnis besser:
Zeilenumbrüche am Ende der Zeichenfolge
Es ist immer noch nicht perfekt, die nachgestellte Newline ist weg. Kommandosubstitution näher betrachten (Abschnitt 3.5.4) :
Nun, da klar ist, warum der Zeilenumbruch wegfällt, kann man sich täuschen, ihn zu behalten. Fügen Sie dazu am Ende eine zusätzliche Zeichenfolge hinzu und entfernen Sie diese, wenn Sie die Variable verwenden:
TL; DR
Fügen Sie einen zusätzlichen Teil am Ende der Ausgabe hinzu und zitieren Sie Variablen:
quelle
Ich hätte meinen kleinen Zusatz in einen Kommentar zur Antwort von cYrus eingefügt, aber ich kann noch keinen Kommentar zu Antworten abgeben, die ich denke. Also werde ich einen Teil von Cyrus 'Antwort der Vollständigkeit halber kopieren.
Was in der ersten Zeile Ihres Codes passiert, ist, dass die Backticks-Ersetzung tatsächlich die nachgestellten Zeilenumbrüche der Ausgabe des ersetzten Befehls auffrisst, wie dokumentiert . Aber es frisst nicht den Zeilenumbruch zwischen Ihren beiden Zeilen.
In der zweiten Codezeile wird das Echo mit zwei Argumenten ausgeführt, der ersten und der zweiten. Wenn Sie die erweiterte Variable in Anführungszeichen setzen, wird Folgendes behoben:
echo "$var"
Dadurch wird die neue Zeile zwischen Zeile eins und Zeile zwei beibehalten. Undecho
fügt standardmäßig eine nachgestellte Zeile hinzu, damit alles in Ordnung ist.Wenn Sie nun alle nachgestellten Zeilenumbrüche in der Ausgabe einer Befehlsersetzung beibehalten möchten, können Sie eine weitere Zeile zur Ausgabe hinzufügen, die Sie nach der Befehlsersetzung entfernen können (siehe hier) .
quelle