Hier ist ein Beispiel, in dem der Inhalt in eine Datei unter geschrieben wird /tmp/yourfilehere
cat << EOF >/tmp/yourfilehereThese contents will be written to the file.This line is indented.
EOF
Beachten Sie, dass das letzte 'EOF' (The LimitString) kein Leerzeichen vor dem Wort haben sollte, da dies bedeutet, dass das LimitStringnicht erkannt wird.
In einem Shell-Skript möchten Sie möglicherweise Einrückungen verwenden, um den Code lesbar zu machen. Dies kann jedoch den unerwünschten Effekt haben, dass der Text in Ihrem Dokument hier eingerückt wird. Verwenden Sie in diesem Fall <<-(gefolgt von einem Bindestrich), um führende Tabulatoren zu deaktivieren. ( Beachten Sie, dass Sie zum Testen das führende Leerzeichen durch ein Tabulatorzeichen ersetzen müssen , da ich hier keine tatsächlichen Tabulatorzeichen drucken kann.)
#!/usr/bin/env bashif true ;then
cat <<- EOF >/tmp/yourfilehereThe leading tab is ignored.
EOFfi
Wenn Sie keine Variablen im Text interpretieren möchten, verwenden Sie einfache Anführungszeichen:
cat <<'EOF'>/tmp/yourfilehereThe variable $FOO will not be interpreted.
EOF
So leiten Sie den Heredoc durch eine Befehlspipeline:
cat <<'EOF'| sed 's/a/b/'
foo
bar
baz
EOF
Ausgabe:
foo
bbr
bbz
... oder um den Heredoc in eine Datei zu schreiben mit sudo:
cat <<'EOF'| sed 's/a/b/'| sudo tee /etc/config_file.conf
foo
bar
baz
EOF
Sie brauchen nicht einmal Bash, diese Funktion ist auch in den Bourne / Korn / POSIX-Shells enthalten.
Janus Troelsen
5
was ist mit <<<, wie heißen sie?
Jürgen Paul
18
@PineappleUndertheSea <<<heißen 'Here Strings'. Code like tr a-z A-Z <<< 'one two three'führt zur Zeichenfolge ONE TWO THREE. Weitere Informationen unter en.wikipedia.org/wiki/Here_document#Here_strings
Stefan Lasiewski
8
Der endgültige EOF sollte auch kein Leerzeichen danach haben. Zumindest bei Bash führt dies dazu, dass es nicht als Begrenzer
erkannt wird
10
Da dieser spezielle Heredoc eher wörtlichen Inhalt als Substitutionen enthalten soll, sollte er <<'EOF'eher als <<EOF.
Charles Duffy
152
Anstelle von catund E / A-Umleitung kann es nützlich sein, teestattdessen Folgendes zu verwenden :
tee newfile <<EOF
line 1
line 2
line 3
EOF
Es ist prägnanter und kann im Gegensatz zum Umleitungsoperator kombiniert werden, sudowenn Sie in Dateien mit Root-Berechtigungen schreiben müssen.
Ich würde vorschlagen, > /dev/nullam Ende der ersten Zeile hinzuzufügen , um zu verhindern, dass der Inhalt der hier gezeigten Datei beim Erstellen stdout angezeigt wird.
Joe Carroll
11
Stimmt, aber Ihre Lösung hat mich eher wegen ihrer Kompatibilität mit sudoals wegen ihrer Kürze angesprochen :-)
Joe Carroll
2
Wie würden Sie diese Methode verwenden, um an eine vorhandene Datei anzuhängen?
MountainX
5
@MountainX Check out man tee. Verwenden Sie das -aFlag zum Anhängen anstatt zu überschreiben.
Livven
3
Für die Verwendung in einem Konfigurationsskript, das ich manchmal überwachen muss, gefällt mir dieses Skript mehr, da es den Inhalt druckt.
Alois Mahdal
59
Hinweis:
Das Folgende verdichtet und organisiert andere Antworten in diesem Thread, insbesondere die hervorragende Arbeit von Stefan Lasiewski und Serge Stroobandt
Die Frage (wie schreibt man hier ein Dokument (auch bekannt als Heredoc ) in eine Datei in einem Bash-Skript?) Hat (mindestens) drei unabhängige Hauptdimensionen oder Unterfragen:
Möchten Sie eine vorhandene Datei überschreiben, an eine vorhandene Datei anhängen oder in eine neue Datei schreiben?
Besitzt Ihr Benutzer oder ein anderer Benutzer (z. B. root) die Datei?
Möchten Sie den Inhalt Ihres Heredocs buchstäblich schreiben oder Bash Variablenreferenzen in Ihrem Heredoc interpretieren lassen?
(Es gibt andere Dimensionen / Unterfragen, die ich nicht für wichtig halte. Bearbeiten Sie diese Antwort, um sie hinzuzufügen!) Hier sind einige der wichtigeren Kombinationen der Dimensionen der oben aufgeführten Frage mit verschiedenen abgrenzenden Bezeichnern - es gibt nichts Stellen Sie EOFeinfach sicher, dass die Zeichenfolge, die Sie als Begrenzungskennung verwenden, nicht in Ihrem Heredoc vorkommt:
So überschreiben Sie eine vorhandene Datei (oder schreiben in eine neue Datei), die Sie besitzen, und ersetzen Sie Variablenreferenzen im heredoc:
cat << EOF >/path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
EOF
So hängen Sie eine vorhandene Datei an (oder schreiben in eine neue Datei), die Sie besitzen, und ersetzen Sie Variablenreferenzen im heredoc:
cat << FOE >>/path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
FOE
So überschreiben Sie eine vorhandene Datei (oder schreiben in eine neue Datei), die Sie besitzen, mit dem wörtlichen Inhalt des Heredoc:
cat <<'END_OF_FILE'>/path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
END_OF_FILE
So hängen Sie eine vorhandene Datei (oder schreiben Sie in eine neue Datei) an, die Sie besitzen, mit dem wörtlichen Inhalt des Heredocs:
cat <<'eof'>>/path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
eof
So überschreiben Sie eine vorhandene Datei (oder schreiben Sie in eine neue Datei), die root gehört, und ersetzen Sie Variablenreferenzen im heredoc:
cat << until_it_ends | sudo tee /path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
until_it_ends
So hängen Sie eine vorhandene Datei (oder schreiben Sie in eine neue Datei) an, die user = foo gehört, mit dem wörtlichen Inhalt des heredoc:
cat <<'Screw_you_Foo'| sudo -u foo tee -a /path/to/your/fileThis line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.Screw_you_Foo
# 6 ist am besten. Aber wie überschreibt man den Inhalt einer vorhandenen Datei mit # 6?
Aleksandr Makov
2
@Aleksandr Makov: Wie überschreibt man den Inhalt einer vorhandenen Datei mit # 6? Lassen Sie das -a== weg --append; dh tee -a-> tee. Siehe info tee(ich würde es hier zitieren, aber das Kommentar-Markup ist zu begrenzt.
TomRoche
1
Gibt es einen Vorteil für # 6, wenn Katze und Paspel zum Abschlagen verwendet werden sudo tee /path/to/your/file << 'Screw_you_Foo'?
Codemonkee
Warum FOEstatt EOFim Anhang?
Becko
2
@becko: nur um zu veranschaulichen, dass das Etikett nur ein Etikett ist. Beachten Sie, dass ich in jedem Beispiel ein anderes Etikett verwendet habe.
TomRoche
41
Um auf der Antwort von @ Livven aufzubauen , finden Sie hier einige nützliche Kombinationen.
Variablensubstitution, führende Registerkarte beibehalten, Datei überschreiben, Echo auf stdout
tee /path/to/file <<EOF
${variable}
EOF
Keine Variablensubstitution , führende Registerkarte beibehalten, Datei überschreiben, Echo auf stdout
tee /path/to/file <<'EOF'
${variable}
EOF
Variablensubstitution, führende Registerkarte entfernt , Datei überschreiben, Echo auf stdout
tee /path/to/file <<-EOF
${variable}
EOF
Variablensubstitution, führende Registerkarte beibehalten, an Datei anhängen , Echo an stdout
tee -a /path/to/file <<EOF
${variable}
EOF
Variablensubstitution, führende Registerkarte beibehalten, Datei überschreiben, kein Echo auf stdout
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
die oben kann kombiniert werden mit sudoals auch
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Benötigen Sie keine Klammern: cat << END > afilegefolgt vom Heredoc funktioniert perfekt.
Glenn Jackman
Danke, dies hat tatsächlich ein anderes Problem gelöst, auf das ich gestoßen bin. Nach ein paar hier Dokumenten gab es einige Probleme. Ich denke, es hat mit den Eltern zu tun, wie es mit den obigen Ratschlägen behoben wurde.
Joshua Enfield
2
Das wird nicht funktionieren. Die Ausgabeumleitung muss am Ende der Zeile stehen, die catwie in der akzeptierten Antwort gezeigt beginnt .
Bis auf weiteres angehalten.
2
@ TennisWilliamson Es funktioniert, dafür sind die Eltern da. Das Ganze catläuft in einer Unterschale, und die gesamte Ausgabe der Unterschale wird in die Datei umgeleitet
Izkata
2
@Izkata: Wenn Sie sich den Bearbeitungsverlauf dieser Antwort ansehen, wurden die Klammern entfernt, bevor ich meinen Kommentar abgegeben und anschließend wieder hinzugefügt habe. Es gilt der Kommentar von Glenn Jackman (und mein).
Bis auf weiteres angehalten.
3
Als Beispiel könnten Sie es verwenden:
Zuerst (SSH-Verbindung herstellen):
while read pass port user ip files directs;do
sshpass -p$pass scp -o 'StrictHostKeyChecking no'-P $port $files $user@$ip:$directs
done<<____HERE
PASS PORT USER IP FILES DIRECTS
..................
PASS PORT USER IP FILES DIRECTS
____HERE
Zweitens (Befehle ausführen):
while read pass port user ip;do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1...
COMMAND n
ENDSSH1
done<<____HERE
PASS PORT USER IP
............
PASS PORT USER IP
____HERE
Drittens (Befehle ausführen):
Script=$'
#Your commands
'while read pass port user ip;do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no'-p $port $user@$ip "$Script"done<<___HERE
PASS PORT USER IP
............
PASS PORT USER IP
___HERE
Viertens (unter Verwendung von Variablen):
while read pass port user ip fileoutput;do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no'-p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
#Your command > $fileinput#Your command > $fileinput
ENDSSH1
done<<____HERE
PASS PORT USER IP FILE-OUTPUT
...............
PASS PORT USER IP FILE-OUTPUT
____HERE
Antworten:
Lesen Sie das Advanced Bash-Scripting-Handbuch, Kapitel 19. Hier Dokumente .
Hier ist ein Beispiel, in dem der Inhalt in eine Datei unter geschrieben wird
/tmp/yourfilehere
Beachten Sie, dass das letzte 'EOF' (The
LimitString
) kein Leerzeichen vor dem Wort haben sollte, da dies bedeutet, dass dasLimitString
nicht erkannt wird.In einem Shell-Skript möchten Sie möglicherweise Einrückungen verwenden, um den Code lesbar zu machen. Dies kann jedoch den unerwünschten Effekt haben, dass der Text in Ihrem Dokument hier eingerückt wird. Verwenden Sie in diesem Fall
<<-
(gefolgt von einem Bindestrich), um führende Tabulatoren zu deaktivieren. ( Beachten Sie, dass Sie zum Testen das führende Leerzeichen durch ein Tabulatorzeichen ersetzen müssen , da ich hier keine tatsächlichen Tabulatorzeichen drucken kann.)Wenn Sie keine Variablen im Text interpretieren möchten, verwenden Sie einfache Anführungszeichen:
So leiten Sie den Heredoc durch eine Befehlspipeline:
Ausgabe:
... oder um den Heredoc in eine Datei zu schreiben mit
sudo
:quelle
<<<
, wie heißen sie?<<<
heißen 'Here Strings'. Code liketr a-z A-Z <<< 'one two three'
führt zur ZeichenfolgeONE TWO THREE
. Weitere Informationen unter en.wikipedia.org/wiki/Here_document#Here_strings<<'EOF'
eher als<<EOF
.Anstelle von
cat
und E / A-Umleitung kann es nützlich sein,tee
stattdessen Folgendes zu verwenden :Es ist prägnanter und kann im Gegensatz zum Umleitungsoperator kombiniert werden,
sudo
wenn Sie in Dateien mit Root-Berechtigungen schreiben müssen.quelle
> /dev/null
am Ende der ersten Zeile hinzuzufügen , um zu verhindern, dass der Inhalt der hier gezeigten Datei beim Erstellen stdout angezeigt wird.sudo
als wegen ihrer Kürze angesprochen :-)man tee
. Verwenden Sie das-a
Flag zum Anhängen anstatt zu überschreiben.Hinweis:
Die Frage (wie schreibt man hier ein Dokument (auch bekannt als Heredoc ) in eine Datei in einem Bash-Skript?) Hat (mindestens) drei unabhängige Hauptdimensionen oder Unterfragen:
root
) die Datei?(Es gibt andere Dimensionen / Unterfragen, die ich nicht für wichtig halte. Bearbeiten Sie diese Antwort, um sie hinzuzufügen!) Hier sind einige der wichtigeren Kombinationen der Dimensionen der oben aufgeführten Frage mit verschiedenen abgrenzenden Bezeichnern - es gibt nichts Stellen Sie
EOF
einfach sicher, dass die Zeichenfolge, die Sie als Begrenzungskennung verwenden, nicht in Ihrem Heredoc vorkommt:So überschreiben Sie eine vorhandene Datei (oder schreiben in eine neue Datei), die Sie besitzen, und ersetzen Sie Variablenreferenzen im heredoc:
So hängen Sie eine vorhandene Datei an (oder schreiben in eine neue Datei), die Sie besitzen, und ersetzen Sie Variablenreferenzen im heredoc:
So überschreiben Sie eine vorhandene Datei (oder schreiben in eine neue Datei), die Sie besitzen, mit dem wörtlichen Inhalt des Heredoc:
So hängen Sie eine vorhandene Datei (oder schreiben Sie in eine neue Datei) an, die Sie besitzen, mit dem wörtlichen Inhalt des Heredocs:
So überschreiben Sie eine vorhandene Datei (oder schreiben Sie in eine neue Datei), die root gehört, und ersetzen Sie Variablenreferenzen im heredoc:
So hängen Sie eine vorhandene Datei (oder schreiben Sie in eine neue Datei) an, die user = foo gehört, mit dem wörtlichen Inhalt des heredoc:
quelle
-a
== weg--append
; dhtee -a
->tee
. Sieheinfo tee
(ich würde es hier zitieren, aber das Kommentar-Markup ist zu begrenzt.sudo tee /path/to/your/file << 'Screw_you_Foo'
?FOE
stattEOF
im Anhang?Um auf der Antwort von @ Livven aufzubauen , finden Sie hier einige nützliche Kombinationen.
Variablensubstitution, führende Registerkarte beibehalten, Datei überschreiben, Echo auf stdout
Keine Variablensubstitution , führende Registerkarte beibehalten, Datei überschreiben, Echo auf stdout
Variablensubstitution, führende Registerkarte entfernt , Datei überschreiben, Echo auf stdout
Variablensubstitution, führende Registerkarte beibehalten, an Datei anhängen , Echo an stdout
Variablensubstitution, führende Registerkarte beibehalten, Datei überschreiben, kein Echo auf stdout
die oben kann kombiniert werden mit
sudo
als auchquelle
Wenn Root-Berechtigungen erforderlich sind
Wenn Root-Berechtigungen für die Zieldatei erforderlich sind, verwenden Sie
|sudo tee
anstelle von>
:quelle
Für zukünftige Personen, bei denen dieses Problem möglicherweise auftritt, hat das folgende Format funktioniert:
quelle
cat << END > afile
gefolgt vom Heredoc funktioniert perfekt.cat
wie in der akzeptierten Antwort gezeigt beginnt .cat
läuft in einer Unterschale, und die gesamte Ausgabe der Unterschale wird in die Datei umgeleitetAls Beispiel könnten Sie es verwenden:
Zuerst (SSH-Verbindung herstellen):
Zweitens (Befehle ausführen):
Drittens (Befehle ausführen):
Viertens (unter Verwendung von Variablen):
quelle
Ich mag diese Methode für Prägnanz, Lesbarkeit und Präsentation in einem eingerückten Skript:
Wo
→
ist ein tabCharakter?quelle