PostgreSQL deaktiviert mehr Ausgabe

146

Ich führe ein Skript auf meinem PostgreSQL-Server aus:

psql db -f sql.sql

von bashoder in einem cronSkript.

Es wird immer wieder versucht, die Ausgabe mit moreoder zu paginieren less.

Wie deaktiviere ich die Ergebnispaginierung in psql?

Ich möchte nur die Daten ändern, mir ist keine Ausgabe wichtig.

Chris
quelle

Antworten:

244

Verwenden Sie: Deaktivieren Sie die Paginierung, behalten Sie jedoch die Ausgabe bei:

\pset pager off

Um sich diese Einstellung zu merken, fügen Sie sie Ihrem ~ / .psqlrc hinzu .

Siehe das psql-Handbuch .

Bei älteren Versionen von Pg war es also nur ein Umschalten \pset pager

Verwenden Sie \o /dev/nullin Ihrem psqlSkript , um die Ausgabe von Abfragen vollständig zu unterdrücken .

Um die psqlInformationsausgabe zu unterdrücken , führen Sie sie mit der Umgebung aus -qoder legen Sie sie fest QUIET=1.


Um Ergebnisse zu produzieren und sie wegzuwerfen können Sie umleiten stdoutzu /dev/nullmit:

psql db -f sql.sql >/dev/null

Sie können sowohl stdout als auch stderr umleiten mit:

psql db -f sql.sql >&/dev/null

aber ich empfehle das nicht, da es Fehlerinformationen wegwirft, die Sie warnen könnten, dass etwas nicht richtig läuft. Sie produzieren auch Ergebnisse und werfen sie weg, was ineffizient ist. Sie sind besser dran, sie erst gar nicht zu produzieren, indem Sie Ihre Abfragen anpassen.

Craig Ringer
quelle
Das verhindert, dass ein Pager verwendet wird, aber die Ausgabe wird nicht gestoppt, oder? Ich vermute, Sie müssten PAGER="/dev/null" psql db -P pager=always -f sql.sqldafür sorgen, dass die Ausgabe immer beendet wird.
Harald Brinkhof
112

Ich habe auch danach gesucht und den Weg in einer ähnlichen Frage zu ServerFault gefunden:

psql -P pager=off <other params>

schaltet das Paging-Ding aus, ohne die Ausgabe zu unterdrücken.

Davide
quelle
4
Diese Antwort war hilfreicher als alles andere über -P in den Manpages. Vielen Dank!
Uhr
genau das brauche ich. Danke :)
Pradip Das
13

Hier ist eine weitere Option. Es hat den Vorteil, dass Sie sich keine psql-Optionsnamen usw. merken müssen.

psql ... | cat
FMc
quelle
absoluter protip! +1
sjas
11

Als Shell verfügt bash über zwei Streams, mit denen Sie diese Ausgabedaten umleiten können: stdout und stderr. Da diese Ausgabe irgendwo umgeleitet werden muss, verfügt Linux über einen bestimmten Knoten, der über / dev / null erreichbar ist . Alles, was Sie dorthin senden, verschwindet einfach in der Leere.

(Shells haben auch einen Eingabestream, aber ich werde dies hier ignorieren, da Sie darum gebeten haben, die Ausgabe zu unterdrücken.)

Diese Streams werden durch Zahlen dargestellt: 1 für stdout und 2 für stderr.

Wenn Sie also nur stdout umleiten möchten, tun Sie dies mit den Operatoren <und >(im Grunde genommen zeigen die Daten darauf, wohin sie fließen).

Angenommen, wir möchten stdout unterdrücken (umleiten nach / dev / null):

psql db -f sql.sql > /dev/null

Wie Sie sehen, ist dies standardmäßig stdout. Es wurde keine Stream-Nummer verwendet, wenn Sie die Stream-Nummer verwenden möchten, die Sie schreiben möchten

psql db -f sql.sql 1> /dev/null

Wenn Sie nun stderror (Stream Nummer 2) unterdrücken möchten, würden Sie verwenden

psql db -f sql.sql 2> /dev/null

Sie können auch einen Stream zu einem anderen umleiten, z. B. stderror zu stdout. Dies ist nützlich, wenn Sie alle Ausgaben irgendwo speichern möchten, regulär und fehlerhaft.

psql db -f sql.sql 2>&1 > log.txt

wohlgemerkt kann es keine Leerzeichen dazwischen geben 2>&1

Schließlich und manchmal am interessantesten ist die Tatsache, dass Sie alle Ausgaben unterdrücken können, indem Sie verwenden &>, wenn Sie es "vollkommen leise" wollen.

psql db -f sql.sql &> /dev/null

Harald Brinkhof
quelle
1
Obwohl diese Informationen im Prinzip solide sind, funktionieren sie in diesem speziellen Fall überhaupt nicht, da psql die informativen Nachrichten nicht an stderr sendet. Sie sind mit Daten auf stdout vermischt.
Jonathan Hartley
Plötzlich wird mir klar, dass Ihr Punkt darin besteht, dass der OP den letzten '&>' Fall verwenden kann, um den Pager zu stoppen, indem alle Ausgaben unterdrückt werden. Ich werde meine Ablehnung entfernen, wenn Sie Ihre Antwort in irgendeiner Weise ändern.
Jonathan Hartley
4
psql db -f sql.sql > /dev/null
Marc B.
quelle