Wenn Sie Ihre vorherige Frage weiterverfolgen, möchten Sie, dass sowohl nicht interpretierter als auch interpretierter Text in eine Datei aufgenommen wird. Verwenden Sie in diesem Fall zwei verschiedene cats (oder echos):
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
Hier ist einiges los: Erstens die Heredoc- Syntax mit <<. Wenn Sie Anführungszeichen in diese Abschlusszeichenfolge einfügen, wie im ersten oben, wird der gesamte Heredoc nicht interpretiert - keine Parameter und keine Ersetzungen. Wenn Sie nicht keine Anführungszeichen verwenden, wie in der zweiten cat oben, Variablen wie $1durch ihre Werte und Befehlsersetzungen ersetzt werden in den Text aufgenommen werden. Sie können wählen, ob Sie die Zeichenfolge "EOF" in Anführungszeichen setzen möchten oder nicht, je nachdem, ob Sie Ersetzungen wünschen oder nicht.
Um beide cats in dieselbe Datei zu setzen, verwenden wir die >> Umleitung für die zweite (und spätere) Umleitung: Das bedeutet, dass an die Datei angehängt wird. Für den ersten verwenden wir eine einzelne >, um die Datei zu löschen und neu zu beginnen.
Beachten Sie, dass selbst wenn Variablen ersetzt werden , zusätzliche Dollarzeichen im Wert dieser Variablen nicht selbst ersetzt werden:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
wird ausgegeben:
$bar
ohne den $barWert von in zu ersetzen .
Wenn Sie jedoch ein "$" im Argument für dieses gesamte Skript angeben, müssen Sie es in der Befehlszeile maskieren oder das Ganze in einfache Anführungszeichen setzen. Alternativ können Sie durch Ersetzen von Befehlen wie in Ihrer anderen Frage den Inhalt einer gesamten Datei direkt einfügen, einschließlich aller Dollarzeichen im Dateiinhalt. Stellen Sie sicher, dass Sie dort die Ersetzungszeichenfolge angeben:
oo.sh "$(cat myfile)"
wird den Körper von myfileas bekommen $1und kann dann catoder echoes nach Bedarf. Es gelten die gleichen Einschränkungen wie in meiner Antwort : Es gibt eine Begrenzung für die Länge der Befehlszeilenargumente. Wenn Ihre Datei länger wird, sollten Sie einen anderen Ansatz finden. Sie können herausfinden, mit welchem Limit Ihr System begrenzt istgetconf ARG_MAX
$1) Dollarzeichen enthält." Nicht, wenn es sich auf den ersten Befehlszeilenparameter bezieht. Dies wurde ersetzt, bevor Ihr Skript ausgeführt wurde. Sie müssen es in der Befehlszeile entkommen.