PostgreSQL wyłącza więcej danych wyjściowych

146

Uruchamiam skrypt na moim serwerze PostgreSQL:

psql db -f sql.sql

z bashlub w cronskrypcie.

Ciągle próbuje podzielić wynik na strony za pomocą morelub less.

Jak wyłączyć stronicowanie wyników w psql?

Chcę tylko zmienić dane, nie obchodzi mnie żadne wyjście.

Chris
źródło

Odpowiedzi:

244

Aby wyłączyć paginację, ale zachować dane wyjściowe, użyj:

\pset pager off

Aby zapamiętać to ustawienie, dodaj je do swojego ~ / .psqlrc .

Zobacz podręcznik psql .

W starszych wersjach Pg był to tylko przełącznik, więc \pset pager

Aby całkowicie pominąć zapytanie, użyj \o /dev/nullw swoim psqlskrypcie.

Aby ukryć psqlinformacje wyjściowe, uruchom je w środowisku -qlub ustaw QUIET=1w nim.


Aby uzyskać wyniki i je wyrzucić, możesz przekierować stdoutdo /dev/null:

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

Możesz przekierować zarówno stdout, jak i stderr za pomocą:

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

ale nie polecam tego, ponieważ spowoduje to odrzucenie informacji o błędach, które mogą ostrzec Cię, że coś jest nie tak. Produkujesz również wyniki i odrzucasz je, co jest nieefektywne; lepiej nie tworzyć ich w pierwszej kolejności, dostosowując zapytania.

Craig Ringer
źródło
To powstrzymuje go przed używaniem pagera, ale nie zatrzymuje wyjścia, prawda? Domyślam się, że musisz PAGER="/dev/null" psql db -P pager=always -f sql.sqlsprawić, by zawsze zabijał wyjście.
Harald Brinkhof
112

Tego też szukałem, znalazłem drogę w podobnym pytaniu na ServerFault:

psql -P pager=off <other params>

wyłącza stronicowanie, bez tłumienia wyjścia.

Davide
źródło
4
Ta odpowiedź była bardziej pomocna niż cokolwiek na temat -P na stronach podręcznika. Dzięki!
północy
właśnie tego potrzebuję. Dzięki :)
Pradip Das
13

Oto inna opcja. Ma tę zaletę, że nie musisz pamiętać nazw opcji psql itp.

psql ... | cat
FMc
źródło
absolutny protip! +1
sjas
11

bash, będąc powłoką , ma 2 strumienie, które możesz przekierować dane wyjściowe: stdout i stderr, ponieważ to wyjście musi być gdzieś przekierowane, linux ma specyficzny węzeł „odrzucaj wszystko” dostępny przez / dev / null . Wszystko, co tam wyślesz, po prostu zniknie w pustce.

(powłoki również mają strumień wejściowy, ale zignoruję to tutaj, ponieważ poprosiłeś o wyciszenie wyjścia)

Te strumienie są reprezentowane przez liczby: 1 dla stdout i 2 dla stderr.

Więc jeśli chcesz przekierować tylko stdout, zrobiłbyś to za pomocą operatorów <i >(w zasadzie tam, gdzie wskazuje, jest miejsce, do którego przepływają dane)

załóżmy, że chcemy zablokować stdout (przekierowanie do / dev / null):

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

Jak widać, jest to standardowe wyjście jest domyślne, żaden numer strumienia nie został użyty, jeśli chcesz użyć numeru strumienia, który napiszesz

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

Teraz, jeśli chcesz stłumić błąd stderror (strumień numer 2), użyjesz

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

Możesz także przekierować jeden strumień do innego, na przykład stderror na stdout, co jest przydatne, jeśli chcesz gdzieś zapisać wszystkie dane wyjściowe, zwykłe i błędy.

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

Pamiętaj, że między nimi nie może być spacji 2>&1

Wreszcie, i czasami najbardziej interesujący jest fakt, że możesz wyłączyć wszystkie wyjścia za pomocą &>, gdy chcesz, aby był `` idealnie cichy ''

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

Harald Brinkhof
źródło
1
Chociaż ta informacja jest w zasadzie rozsądna, w tym konkretnym przypadku w ogóle nie działa, ponieważ psql nie wysyła wiadomości informacyjnych do stderr. Są one przeplatane z danymi na stdout.
Jonathan Hartley
Nagle zdaję sobie sprawę, że chodzi o to, że ostatni przypadek „&>” może zostać użyty przez OP do zatrzymania pagera, poprzez wyciszenie całego wyjścia. Usunę mój głos przeciw, jeśli w jakikolwiek sposób zmienisz swoją odpowiedź.
Jonathan Hartley
4
psql db -f sql.sql > /dev/null
Marc B.
źródło