Ich versuche, Variablen innerhalb eines Bash-Heredocs zu interpolieren:
var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF
Dies funktioniert nicht wie erwartet ( $var
wird wörtlich behandelt, nicht erweitert).
Ich muss verwenden, sudo tee
weil das Erstellen der Datei sudo erfordert. So etwas tun wie:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
Funktioniert nicht, da >outfile
die Datei in der aktuellen Shell geöffnet wird, die kein sudo verwendet.
''
), aber nicht das Zitieren des Trennzeichens aktiviert die Erweiterung (als ob es in wäre""
). Allerdings ist Ihre Intuition richtig in Perl, wo ein heredoc mit einfachen Anführungszeichen Kennung verhält sich , als ob es in einfachen Anführungszeichen waren, eines mit einer doppelten Anführungszeichen Kennung , als ob in doppelten Anführungszeichen, und ein mit Rück tickte Kennung , als ob in Backticks ! Siehe: Perlop: << EOFAntworten:
Bei der Beantwortung Ihrer ersten Frage gibt es keine Parameterersetzung, da Sie das Trennzeichen in Anführungszeichen setzen - im Bash-Handbuch heißt es :
Wenn Sie Ihr erstes Beispiel ändern, um es
<<EOF
anstelle von zu verwenden<< "EOF"
Sie feststellen, dass es funktioniert.In Ihrem zweiten Beispiel wird die Shell
sudo
nur mit dem Parameter aufgerufencat
, und die Umleitung gilt für die Ausgabe dessudo cat
ursprünglichen Benutzers. Es wird funktionieren, wenn Sie versuchen:quelle
(cat > /path/to/outfile) <<EOF
anstelle dessudo sh -c ... <<EOF
Verwenden Sie keine Anführungszeichen mit
<<EOF
:Die Variablenerweiterung ist das Standardverhalten in here-docs. Sie deaktivieren dieses Verhalten, indem Sie die Bezeichnung in Anführungszeichen setzen (mit einfachen oder doppelten Anführungszeichen).
quelle
Als späte Folge der früheren Antworten hier geraten Sie wahrscheinlich in Situationen, in denen einige, aber nicht alle Variablen interpoliert werden sollen. Sie können dies lösen, indem Sie Backslashes verwenden, um Dollarzeichen und Backticks zu entkommen. oder Sie können den statischen Text in eine Variable einfügen.
Demo: https://ideone.com/rMF2XA
Beachten Sie, dass einer der Angebotsmechanismen -
\____HERE
oder"____HERE"
oder'____HERE'
- die gesamte Variableninterpolation deaktiviert und das Here-Dokument in einen wörtlichen Text umwandelt.Eine häufige Aufgabe besteht darin, lokale Variablen mit Skripten zu kombinieren, die von einer anderen Shell, Programmiersprache oder einem anderen Remote-Host ausgewertet werden sollten.
quelle