PostgreSQL désactive plus de sortie

146

J'exécute un script sur mon serveur PostgreSQL:

psql db -f sql.sql

depuis bashou dans un cronscript.

Il essaie de paginer la sortie avec moreou less.

Comment désactiver la pagination des résultats dans psql?

Tout ce que je veux faire, c'est changer les données, je ne me soucie d'aucune sortie.

Chris
la source

Réponses:

244

Pour désactiver la pagination mais conserver la sortie, utilisez:

\pset pager off

Pour vous souvenir de ce paramètre, ajoutez-le à votre ~ / .psqlrc .

Consultez le manuel psql .

Sur les anciennes versions de Pg, ce n'était qu'une bascule, donc \pset pager

Pour supprimer complètement la sortie de la requête, utilisez \o /dev/nulldans votre psqlscript.

Pour supprimer psqlla sortie d'information de, exécutez-la avec -qou définie QUIET=1dans l'environnement.


Pour produire des résultats et les jeter, vous pouvez vous rediriger stdoutvers /dev/nullavec:

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

Vous pouvez rediriger à la fois stdout et stderr avec:

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

mais je ne le recommande pas, car cela rejettera les informations d'erreur qui pourraient vous avertir que quelque chose ne va pas. Vous produisez également des résultats et vous les jetez, ce qui est inefficace; vous feriez mieux de ne pas les produire en premier lieu en ajustant vos requêtes.

Craig Ringer
la source
Cela l'empêche d'utiliser un pager mais cela n'arrête pas la sortie, non? Je suppose que vous devez PAGER="/dev/null" psql db -P pager=always -f sql.sqltoujours le faire tuer la sortie.
Harald Brinkhof
112

Je cherchais cela aussi, j'ai trouvé le chemin dans une question similaire sur ServerFault:

psql -P pager=off <other params>

désactive la chose de pagination, sans supprimer la sortie.

Davide
la source
4
Cette réponse a été plus utile que tout ce qui concerne -P dans les pages de manuel. Merci!
nortally
c'est exactement ce dont j'ai besoin. Merci :)
Pradip Das
13

Voici une autre option. Cela présente l'avantage que vous n'avez pas à vous souvenir des noms d'options psql, etc.

psql ... | cat
FMc
la source
protip absolu! +1
sjas
11

bash, étant un shell , a 2 flux que vous pouvez rediriger ces données de sortie: stdout et stderr, car cette sortie doit être redirigée quelque part, linux a un nœud spécifique `` tout supprimer '' accessible via / dev / null . Tout ce que vous envoyez là-bas disparaîtra dans le vide.

(les shells ont également un flux d'entrée mais je vais l'ignorer ici puisque vous avez demandé la suppression de la sortie)

Ces flux sont représentés par des nombres: 1 pour stdout et 2 pour stderr.

Donc, si vous voulez rediriger juste stdout, vous le feriez avec les opérateurs <et >(essentiellement là où il pointe, c'est vers où les données circulent)

supposons que nous voulions supprimer stdout (rediriger vers / dev / null):

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

Comme vous pouvez le voir, stdout est la valeur par défaut, aucun numéro de flux n'a été utilisé si vous vouliez utiliser le numéro de flux que vous écririez

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

Maintenant, si vous souhaitez supprimer stderror (flux numéro 2), vous utilisez

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

Vous pouvez également rediriger un flux vers un autre, par exemple stderror vers stdout, ce qui est utile si vous souhaitez enregistrer toute la sortie quelque part, régulière et erreurs.

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

attention, il ne peut pas y avoir d'espaces entre 2>&1

Enfin et parfois le plus intéressant est le fait que vous pouvez supprimer toutes les sorties en utilisant &>, pour quand vous le voulez 'parfaitement silencieux'

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

Harald Brinkhof
la source
1
Bien que cette information soit valable en principe, elle ne fonctionne pas du tout dans ce cas précis, car psql n'envoie pas les messages informatifs à stderr. Ils sont entremêlés avec des données sur stdout.
Jonathan Hartley
Soudain, je me rends compte que votre point est que le cas final '&>' peut être utilisé par l'OP pour arrêter le téléavertisseur, en supprimant toute sortie. Je retirerai mon vote défavorable si vous modifiez votre réponse de quelque manière que ce soit.
Jonathan Hartley
4
psql db -f sql.sql > /dev/null
Marc B
la source