Die folgenden Beispiele zeigen, dass einer Here -Zeichenfolge eine neue Zeile hinzugefügt wird .
Warum wird das gemacht?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
quelle
Die folgenden Beispiele zeigen, dass einer Here -Zeichenfolge eine neue Zeile hinzugefügt wird .
Warum wird das gemacht?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
Die einfache Antwort ist, dass ksh so geschrieben ist (und bash kompatibel ist). Aber es gibt einen Grund für diese Designwahl.
Die meisten Befehle erwarten eine Texteingabe. In der Unix-Welt besteht eine Textdatei aus einer Folge von Zeilen, die jeweils in einer neuen Zeile enden . In den meisten Fällen ist daher ein abschließender Zeilenumbruch erforderlich. Ein besonders häufiger Fall ist es, die Ausgabe eines Befehls mit einer Befehlssuspension zu erfassen, auf irgendeine Weise zu verarbeiten und dann an einen anderen Befehl weiterzuleiten. Die Befehlsersetzung entfernt die letzten Zeilenumbrüche. <<<
legt einen zurück.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash und ksh können ohnehin keine Binärdaten manipulieren (sie können keine Nullzeichen verarbeiten), daher ist es nicht verwunderlich, dass ihre Funktionen auf Textdaten ausgerichtet sind.
Die <<<
Here-String-Syntax dient meist nur der Vereinfachung, wie bei <<
Here-Dokumenten. Wenn Sie keine letzte neue Zeile hinzufügen müssen, verwenden Sie echo -n
(in Bash) oder printf
und eine Pipeline.
<<<
wurde in die Welt von Bourne eingeführtzsh
, nichtksh
. Und es wurde durch einen ähnlichen Betreiber im Hafen Unix inspiriert vonrc
denen haben nicht , dass zusätzliche Newline - Zeichen hinzufügen. Interessanterweise=(<<<text)
fügt der Operator diesen Zeilenumbruch nicht hinzuzsh
.printf
usw. zu verwenden), um das Einfügen von Zeilenumbrüchen zu vermeidenbash
? Like @ StéphaneChazelas darauf ist in möglichzsh
.Ein Szenario, in dem es praktisch ist, Zeilenumbrüche an Here-Strings anzuhängen, ist die Verwendung des
read
Befehls, wennset -e
mode aktiv ist. Erinnern Sie sich,set -e
dass ein Skript beendet wird, wenn es (mehr oder weniger) auf Anweisungen stößt, die einen Statuscode ungleich Null generieren.read
Beachten Sie, dass ein Statuscode ungleich Null generiert wird, wenn eine Zeichenfolge ohne Zeilenumbrüche gefunden wird:quelle
Ich denke, das ist der einzige Weg, um am Ende eines Here-Strings einen Newline-Beweis zu erhalten:
Es scheint, dass der Here-String-Operator Zeilenumbrüche entfernt, sofern diese nicht in der von Ihnen übermittelten Syntax angegeben sind.
quelle
xxd <<<$(echo a)
.