O PostgreSQL desativa mais saída

146

Estou executando um script no meu servidor PostgreSQL:

psql db -f sql.sql

de bashou em um cronscript.

Ele continua tentando paginar a saída com moreou less.

Como desativo a paginação de resultados psql?

Tudo o que quero fazer é alterar os dados, não me importo com nenhuma saída.

Chris
fonte

Respostas:

244

Para desativar a paginação, mas reter a saída, use:

\pset pager off

Para lembrar dessa configuração, adicione-a ao seu ~ / .psqlrc .

Veja o manual do psql .

Nas versões mais antigas do Pg, era apenas uma alternância, então \pset pager

Para suprimir completamente a saída da consulta, use \o /dev/nullno seu psqlscript.

Para suprimir psqla saída informativa, execute-a com -qou defina-a QUIET=1no ambiente.


Para produzir resultados e jogá-los fora, você pode redirecionar stdoutpara /dev/null:

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

Você pode redirecionar stdout e stderr com:

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

mas não recomendo isso, pois descartará informações de erro que podem avisar que algo não está indo bem. Você também está produzindo resultados e jogando-os fora, o que é ineficiente; é melhor você não produzi-las em primeiro lugar, ajustando suas consultas.

Craig Ringer
fonte
Isso impede o uso de um pager, mas não para a saída, não? Suponho que você precisaria PAGER="/dev/null" psql db -P pager=always -f sql.sqlsempre matar a saída.
Harald Brinkhof
112

Eu também estava procurando por isso, encontrei o caminho em uma pergunta semelhante no ServerFault:

psql -P pager=off <other params>

desativa a paginação, sem suprimir a saída.

Davide
fonte
4
Esta resposta foi mais útil do que qualquer coisa sobre -P nas páginas de manual. Obrigado!
Nortally 5/05
é disso que eu preciso exatamente. Obrigado :)
Pradip Das
13

Aqui está outra opção. Tem a vantagem de você não precisar se lembrar dos nomes das opções do psql etc.

psql ... | cat
FMc
fonte
protip absoluto! +1
sjas
11

bash, sendo um shell , possui 2 fluxos que você pode redirecionar os dados de saída: stdout e stderr, porque essa saída precisa ser redirecionada para algum lugar, o linux tem um nó específico 'descartar tudo' acessível através de / dev / null . Tudo o que você envia para lá simplesmente desaparece no vazio.

(os shells também têm um fluxo de entrada, mas ignorarei isso aqui, pois você pediu para suprimir a saída)

Esses fluxos são representados por números: 1 para stdout e 2 para stderr.

Portanto, se você deseja redirecionar apenas o stdout, faça isso com os operadores <e >(basicamente para onde ele aponta é para onde os dados fluem)

suponha que desejamos suprimir stdout (redirecione para / dev / null):

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

Como você pode ver, stdout é o padrão, nenhum número de fluxo foi usado se você quisesse usar o número de fluxo que escreveria

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

Agora, se você deseja suprimir o stderror (fluxo número 2), use

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

Você também pode redirecionar um fluxo para outro, por exemplo, stderror para stdout, o que é útil se você deseja salvar toda a saída em algum lugar, regular e erros.

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

lembre-se, não pode haver espaços entre 2>&1

Finalmente e, às vezes, mais interessante é o fato de que você pode suprimir toda a saída usando &>, para quando quiser 'perfeitamente silencioso'

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

Harald Brinkhof
fonte
1
Embora essas informações sejam sólidas em princípio, não funcionam de maneira alguma nesse caso específico, porque o psql não envia as mensagens informativas ao stderr. Eles são misturados com dados no stdout.
27613 Jonathan Hartley
De repente, percebo que seu argumento é que o caso final '&>' pode ser usado pelo OP para parar o pager, suprimindo toda a saída. Retirei meu voto negativo se você alterar sua resposta de alguma forma.
27613 Jonathan Hartley
4
psql db -f sql.sql > /dev/null
Marc B
fonte