Warum listet „echo $(cat /path/to/fileName)“ meine Dateien und Anweisungen auf?

Warum listet „echo $(cat /path/to/fileName)“ meine Dateien und Anweisungen auf?

Wenn ich den Inhalt einer Datei mit ausdrucke echo $(cat /path/to/filename), werden auch meine Dateien und Anweisungen aufgelistet. Aber wenn ich printf "$(cat /path/to/filename)\n"das mit mache, funktioniert es einwandfrei.

Ich habe auch versucht, es in einer Variablen zu speichern content='cat /path/to/filename'(auch content=$(cat /path/to/filename) und dann auszudrucken echo $content, aber ich erhalte dasselbe Ergebnis (Dateiliste und Anweisungen).

Ich möchte den Inhalt der Datei in einer Variable speichern und die Variable als Eingabe für den nächsten Befehl an mein Skript übergeben.

Beachten Sie, dass der Inhalt meiner Datei Sonderzeichen enthält *.

Antwort1

Denn nach der Befehlsersetzung führt die Shell eine Wortaufteilung (oder Feldaufteilung) am Ergebnis durch, wenn Sie diese nicht in Anführungszeichen setzen.

POSIX definiertWorterweiterungals:

Die Reihenfolge der Worterweiterung soll wie folgt sein:

  1. Tilde-Erweiterung (siehe Tilde-Erweiterung), Parametererweiterung (siehe Parametererweiterung), Befehlsersetzung (siehe Befehlsersetzung) und arithmetische Erweiterung (siehe arithmetische Erweiterung) müssen von Anfang bis Ende durchgeführt werden. Siehe Punkt 5 in Token-Erkennung.

  2. Die Feldaufteilung (siehe Feldaufteilung) wird für die Teile der Felder durchgeführt, die in Schritt 1 generiert wurden, es sei denn, IFS ist null.

  3. Es soll eine Pfadnamenerweiterung (siehe Pfadnamenerweiterung) durchgeführt werden, sofern nicht Set -f aktiv ist.

  4. Die Angebotsentfernung (siehe Angebotsentfernung) muss immer zuletzt durchgeführt werden.

In Ihrem Fall *stimmte alles im aktuellen Arbeitsverzeichnis überein. Sie müssen das Ergebnis in Anführungszeichen setzen, um die erwartete Ausgabe zu erhalten:

echo "$(cat /path/to/fileName)"

Antwort2

Zitieren Sie es:

$ echo "*" >> test
$ echo $(cat test)
bash43-001 bash43-002 bash43-003 bash43-004 bash43-005 test
$ echo "$(cat test)"
*

Als erste Regel gilt: Befehlsersetzungen immer in Anführungszeichen setzen.

Das leere Feld *wird in erweitert bash, sofern Sie die Globierung nicht deaktivieren ( set -foder setopt noglob) oder es in Anführungszeichen setzen bzw. es maskieren: "*" \*. Für die Befehlsausgabe ist es immer am besten, Anführungszeichen zu verwenden.

verwandte Informationen