Der folgende Code beschreibt die Situation am besten. Warum gibt die letzte Zeile kein Zeilenumbruchzeichen aus? Die Ausgabe jeder Zeile wird im Kommentar angezeigt. Ich benutze GNU Bash, Version 4.1.5
echo -n $'a\nb\n' | xxd -p # 610a620a
x=$'a\nb\n' ; echo -n "$x" | xxd -p # 610a620a
echo -ne "a\nb\n" | xxd -p # 610a620a
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p # 610a62
tmp=$(somecommand; echo a); tmp=${tmp%a}
tmp=$(somecommand; echo a)
... Dies hat sicherlich den Punkt nach Hause getrieben ... Bis ich das Beispiel gesehen habe, wäre meine Tendenz immer noch gewesen, es zu verwendenecho -n a
... aber natürlich !, es besteht keine Notwendigkeit dafür die-n
, weil durch die Befehlsersetzung die eingeführte abschließende Zeile auf jeden Fall entfernt wird! ... danke ...Antworten:
Die Befehlsersetzungsfunktion
$()
(und ihre Cousine das Backtick) entfernt speziell nachfolgende Zeilenumbrüche. Dies ist das dokumentierte Verhalten und sollte bei der Verwendung des Konstrukts immer beachtet werden.Zeilenumbrüche im Textkörper werden vom Ersetzungsoperator nicht entfernt. Sie können jedoch auch entfernt werden, wenn Sie eine Wortteilung in der Shell durchführen. Wie sich das herausstellt, hängt davon ab, ob Sie Anführungszeichen verwendet haben oder nicht. Beachten Sie den Unterschied zwischen diesen beiden Verwendungen:
Im zweiten Beispiel wurde die Ausgabe nicht in Anführungszeichen gesetzt und die neue Zeile als Worttrennung interpretiert, sodass sie in der Ausgabe als Leerzeichen angezeigt wird!
quelle
Bei Verwendung der Befehlssubstitution führt die Shell die Befehle in einer Subshell aus und gibt ihre Standardausgabe zurück. In diesem Prozess verlieren die IFS-Zeichen ihre Bedeutung (wenn sie nicht in Anführungszeichen gesetzt sind), da das Commend einfach aufgeteilte Wörter zurückgibt und die nachfolgenden entfernt werden. Beispielsweise:
und praktischer,
pwd
wird funktionieren, auch wenn Ihr Verzeichnisname eine neue Zeile dazwischen hat, aber$(pwd)
nicht.Die übliche Problemumgehung besteht darin, am Ende Ihres Befehls etwas hinzuzufügen und es anschließend zu entfernen.
quelle
echo "$(echo -e '\n')" | wc
, welches1 0 1
im Vergleich zum ausgibt2 0 2
$(pwd)
und"$(pwd)"
, siehe Calebs Antwort.