PostgreSQL отключить больше вывода

146

Я запускаю скрипт на моем сервере PostgreSQL:

psql db -f sql.sql

из bashили в cronсценарии.

Он продолжает пытаться разбить вывод на страницы с помощью moreили less.

Как отключить пагинацию результатов в psql?

Все, что я хочу сделать, это изменить данные, мне все равно, какой вывод.

Крис
источник

Ответы:

244

Чтобы отключить нумерацию страниц, но сохранить вывод, используйте:

\pset pager off

Чтобы запомнить этот параметр, добавьте его в ~ / .psqlrc .

Смотрите руководство по PSQL .

На старых версиях Pg это был просто переключатель, поэтому \pset pager

Чтобы полностью подавить вывод запроса, используйте \o /dev/nullв своем psqlскрипте.

Чтобы подавить psqlинформационный вывод, запустите его -qили установите QUIET=1в среде.


Чтобы получить результаты и выбросить их, вы можете перенаправить stdoutс /dev/nullпомощью:

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

Вы можете перенаправить как stdout, так и stderr с помощью:

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

но я не рекомендую этого, поскольку это приведет к удалению информации об ошибках, которая может предупредить вас, что что-то идет не так. Вы также производите результаты и выбрасываете их, что неэффективно; вам лучше просто не производить их в первую очередь, корректируя свои запросы.

Крейг Рингер
источник
Это мешает использовать пейджер, но не останавливает вывод, нет? Я предполагаю, что вам нужно, PAGER="/dev/null" psql db -P pager=always -f sql.sqlчтобы это всегда убивало вывод.
Харальд Бринкхоф
112

Я тоже искал это, я нашел путь в аналогичном вопросе о ServerFault:

psql -P pager=off <other params>

отключает пейджинговую вещь, не подавляя вывод.

Davide
источник
4
Этот ответ был более полезным, чем что-либо о -P на страницах руководства. Спасибо!
обычно
это то, что мне нужно именно. Спасибо :)
Прадип Дас
13

Вот еще один вариант. Преимущество в том, что вам не нужно запоминать имена опций psql и т. Д.

psql ... | cat
FMC
источник
абсолютный протип! +1
sjas
11

bash, являясь оболочкой , имеет 2 потока, которые вы можете перенаправить на эти выходные данные: stdout и stderr, поскольку этот вывод необходимо куда-то перенаправить, у linux есть специальный узел «сбросить все», доступный через / dev / null . Все, что вы отправите туда, просто исчезнет в пустоте.

(оболочки также имеют входной поток, но я проигнорирую это здесь, так как вы просили подавить вывод)

Эти потоки представлены числами: 1 для stdout и 2 для stderr.

Так что если вы хотите , чтобы перенаправить только стандартный вывод вы бы сделать это с <и >операторы ( в основном , где он указывает на то , где потоки данных в)

предположим, что мы хотим подавить стандартный вывод (перенаправление в / dev / null):

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

Как вы можете видеть, это стандартный вывод по умолчанию, номер потока не использовался, если вы хотите использовать номер потока, который вы пишете

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

Теперь, если вы хотите подавить stderror (поток номер 2), вы должны использовать

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

Вы также можете перенаправить один поток на другой, например, stderror на stdout, что полезно, если вы хотите сохранить все выходные данные, обычные и ошибки.

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

имейте в виду, что не может быть пробелов между 2>&1

Наконец, и иногда самым интересным является тот факт, что вы можете подавить весь вывод, используя &>, когда вы хотите, чтобы он был «совершенно тихим».

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

Харальд Бринкхоф
источник
1
Хотя эта информация в принципе является достоверной, в данном конкретном случае она вообще не работает, поскольку psql не отправляет информационные сообщения в stderr. Они смешаны с данными о stdout.
Джонатан Хартли
Внезапно я понимаю, что ваша точка зрения состоит в том, что последний случай '&>' может использоваться OP, чтобы остановить пейджер, подавляя весь вывод. Я уберу свое понижение, если вы измените свой ответ каким-либо образом.
Джонатан Хартли