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

102

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

psql db -f sql.sql

из bash или в cron script.

Он пытается разбивать страницы на more или less.

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

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

Теги:

6 ответов

191

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

\pset pager off

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

См. руководство psql.

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

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

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


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

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

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

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

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

  • 0
    Это мешает использовать пейджер, но не останавливает вывод, нет? Я предполагаю, что вам понадобится PAGER="/dev/null" psql db -P pager=always -f sql.sql чтобы он всегда убивал вывод.
  • 3
    Нет, используйте \ o / dev / null
84

Я тоже искал это, я нашел способ в подобном вопросе на ServerFault:

psql -P pager=off <other params>

отключает ведение поискового вызова, не подавляя вывод.

  • 3
    Этот ответ был более полезным, чем что-либо о -P на страницах руководства. Спасибо!
  • 0
    это то, что мне нужно именно. Спасибо :)
7

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

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

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

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

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

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

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

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.
  • 0
    Внезапно я понимаю, что ваша точка зрения состоит в том, что последний случай '&>' может использоваться OP, чтобы остановить пейджер, подавляя весь вывод. Я уберу свое понижение, если вы измените свой ответ каким-либо образом.
3

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

psql ... | cat
  • 0
    абсолютный протип! +1
3
psql db -f sql.sql > /dev/null
0
psql -U user -P pager=off -d database -c 'SQL';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню