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>

вимикає сторінку підключення, не придушуючи вихід.


4
Ця відповідь була кориснішою за все про -P на сторінках man. Дякую!
півночі

саме це мені і потрібно. Дякую :)
Прадіп Дас

13

Ось ще один варіант. Це має таку перевагу, що вам не потрібно запам’ятовувати назви опцій psql тощо.

psql ... | cat

абсолютний протип! +1
sjas

11

bash, будучи оболонкою , має 2 потоки, ви можете перенаправляти такі вихідні дані: stdout та stderr, оскільки цей вихід потрібно кудись переспрямувати, у Linux є специфічний вузол "відкинути все", доступний через / 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 to stdout, що корисно, якщо ви хочете зберегти весь вихід десь, регулярний та помилки.

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

пам'ятайте, що між ними не може бути пробілів 2>&1

Нарешті, а іноді найцікавішим є той факт, що ви можете придушити весь результат, використовуючи &>, бо, коли хочете, щоб він був «абсолютно тихим»

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


1
Хоча ця інформація звучить в принципі, вона взагалі не працює в цьому конкретному випадку, оскільки psql не надсилає інформаційні повідомлення на stderr. Вони переплутані з даними про stdout.
Джонатан Хартлі

Раптом я усвідомлюю, що Ваша думка полягає в тому, що остаточний випадок "&>" може використовуватись ОП для зупинки пейджера, придушуючи весь вихід. Я видалю свою позицію, якщо ви будь-яким чином поправите відповідь.
Джонатан Хартлі


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.