Ich musste ein Skript schreiben, um mehrzeilige Eingaben in ein Programm einzugeben ( psql
).
Nach einigem googeln stellte ich fest, dass die folgende Syntax funktioniert:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
Dadurch wird die mehrzeilige Zeichenfolge (von BEGIN;
bis END;
einschließlich) korrekt erstellt und als Eingabe an weitergeleitet psql
.
Aber ich habe keine Ahnung, wie / warum es funktioniert, kann jemand bitte erklären?
Ich beziehe mich hauptsächlich auf cat << EOF
, ich kenne >
Ausgaben für eine Datei, >>
hänge an eine Datei an, lese <
Eingaben aus Dateien.
Was macht <<
genau?
Und gibt es eine Manpage dafür?
cat
. Versuchen Siepsql ... << EOF ...
Siehe auch "hier Zeichenfolgen". mywiki.wooledge.org/BashGuide/InputAndOutput?#Here_Stringscat
stding liest (wenn es weitergeleitet wird) oder eine Datei liest, die seinen Befehlszeilenargumenten entsprichtAntworten:
Dies wird als Heredoc- Format bezeichnet , um eine Zeichenfolge in stdin bereitzustellen. Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/Here_document#Unix_shells .
Von
man bash
:quelle
<<-
Bitte beachten Sie, dass nur führende Registerkarte Zeichen entfernt werden - nicht weich Tabulatoren. Dies ist einer der seltenen Fälle, in denen Sie das Tabulatorzeichen tatsächlich benötigen. Wenn der Rest Ihres Dokuments weiche Registerkarten verwendet, stellen Sie sicher, dass unsichtbare Zeichen angezeigt werden, und kopieren Sie (z. B.) ein Tabulatorzeichen und fügen Sie es ein. Wenn Sie es richtig machen, sollte Ihre Syntaxhervorhebung das Endtrennzeichen korrekt erfassen.Das
cat <<EOF
Syntax ist sehr nützlich, wenn Sie mit mehrzeiligem Text in Bash arbeiten, z. Wenn Sie einer Shell-Variablen, einer Datei oder einer Pipe mehrzeilige Zeichenfolgen zuweisen.Beispiele von
cat <<EOF
Verwendung Syntax in Bash:1. Weisen Sie einer Shell-Variablen eine mehrzeilige Zeichenfolge zu
Die
$sql
Variable enthält jetzt auch die Zeichen für neue Zeilen. Sie können mit überprüfenecho -e "$sql"
.2. Übergeben Sie eine mehrzeilige Zeichenfolge an eine Datei in Bash
Die
print.sh
Datei enthält jetzt:3. Übergeben Sie eine mehrzeilige Zeichenfolge an ein Rohr in Bash
Die
b.txt
Datei enthältbar
undbaz
Zeilen. Die gleiche Ausgabe wird gedrucktstdout
.quelle
In Ihrem Fall wird "EOF" als "Here Tag" bezeichnet. Grundsätzlich
<<Here
teilt die Shell mit, dass Sie eine mehrzeilige Zeichenfolge bis zum "Tag" eingeben werdenHere
. Sie können dieses Tag beliebig benennen, es ist häufigEOF
oderSTOP
.Einige Regeln zu den Here-Tags:
Beispiel:
quelle
<<-
Verwendung der führenden Registerkarte nicht verhindert wird, dass das Tag erkannt wirdPOSIX 7
kennytm zitiert
man bash
, aber das meiste davon ist auch POSIX 7: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :Beispiele
Einige Beispiele noch nicht angegeben.
Anführungszeichen verhindern die Parametererweiterung
Ohne Anführungszeichen:
Ausgabe:
Mit Anführungszeichen:
oder (hässlich aber gültig):
Ausgänge:
Bindestrich entfernt führende Tabulatoren
Ohne Bindestrich:
wo
<tab>
ist eine wörtliche Registerkarte und kann mit eingefügt werdenCtrl + V <tab>
Ausgabe:
Mit Bindestrich:
Ausgabe:
Dies ist natürlich vorhanden, damit Sie
cat
den umgebenden Code einrücken können , der einfacher zu lesen und zu warten ist. Z.B:Leider funktioniert dies nicht für Leerzeichen: POSIX bevorzugte
tab
hier den Einzug. Huch.quelle
<<-
und<tab>a
sollte beachtet werden, dass der Zweck darin bestand, ein normales Einrücken von Code innerhalb des Skripts zu ermöglichen, während Heredoc-Text, der dem Empfangsprozess präsentiert wird, in Spalte 0 beginnen kann. Dies ist eine nicht allzu häufig vorkommende Funktion und ein bisschen Mehr Kontext kann viel Kopfkratzen verhindern ...$
"$a"'$b'"$c"
, aber hier gibt es kein Analogon AFAIK.Verwenden Sie Tee anstelle von Katze
Nicht gerade als Antwort auf die ursprüngliche Frage, aber ich wollte dies trotzdem teilen: Ich musste eine Konfigurationsdatei in einem Verzeichnis erstellen, für das Root-Rechte erforderlich waren.
Folgendes funktioniert in diesem Fall nicht:
weil die Umleitung außerhalb des Sudo-Kontexts erfolgt.
Ich habe stattdessen folgendes verwendet:
quelle
Eine kleine Erweiterung der obigen Antworten. Das Trailing
>
leitet die Eingabe in die Datei und überschreibt den vorhandenen Inhalt. Eine besonders bequeme Verwendung ist jedoch der Doppelpfeil>>
, der angehängt wird und Ihren neuen Inhalt am Ende der Datei hinzufügt, wie in:Dies erweitert Ihre Möglichkeiten,
fstab
ohne dass Sie sich Sorgen machen müssen, dass Sie versehentlich Inhalte ändern.quelle
Dies ist nicht unbedingt eine Antwort auf die ursprüngliche Frage, sondern ein Austausch einiger Ergebnisse meiner eigenen Tests. Diese:
erzeugt die gleiche Datei wie:
Daher sehe ich keinen Sinn darin, den Befehl cat zu verwenden.
quelle
<<test
ohne verwendet wurdencat <<test
.Erwähnenswert ist, dass hier Dokumente auch in Bash-Loops funktionieren. Dieses Beispiel zeigt, wie die Spaltenliste der Tabelle abgerufen wird:
oder auch ohne die neue Zeile
quelle