Wie kann ich hier ein Dokument in eine Datei im Bash-Skript schreiben?
Wie kann ich hier ein Dokument in eine Datei im Bash-Skript schreiben?
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
cat << EOF > /tmp/yourfilehere
These 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 LimitString
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.)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Wenn Sie keine Variablen im Text interpretieren möchten, verwenden Sie einfache Anführungszeichen:
cat << 'EOF' > /tmp/yourfilehere
The 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
<<<
, wie heißen sie?
<<<
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
<<'EOF'
eher als <<EOF
.
Anstelle von cat
und E / A-Umleitung kann es nützlich sein, tee
stattdessen 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, sudo
wenn Sie in Dateien mit Root-Berechtigungen schreiben müssen.
> /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:
cat << EOF > /path/to/your/file
This 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/file
This 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/file
This 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/file
This 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/file
This 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/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
Screw_you_Foo
-a
== weg --append
; dh tee -a
-> tee
. Siehe info tee
(ich würde es hier zitieren, aber das Kommentar-Markup ist zu begrenzt.
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
statt EOF
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
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 sudo
als auch
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Wenn Root-Berechtigungen für die Zieldatei erforderlich sind, verwenden Sie |sudo tee
anstelle von >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Für zukünftige Personen, bei denen dieses Problem möglicherweise auftritt, hat das folgende Format funktioniert:
(cat <<- _EOF_
LogFile /var/log/clamd.log
LogTime yes
DatabaseDirectory /var/lib/clamav
LocalSocket /tmp/clamd.socket
TCPAddr 127.0.0.1
SelfCheck 1020
ScanPDF yes
_EOF_
) > /etc/clamd.conf
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 umgeleitet
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