PostgreSQL menonaktifkan lebih banyak output

146

Saya menjalankan skrip di server PostgreSQL saya:

psql db -f sql.sql

dari bashatau dalam cronnaskah.

Itu terus mencoba untuk memberi pagination pada output dengan moreatau less.

Bagaimana cara menonaktifkan pagination hasil psql?

Yang ingin saya lakukan adalah mengubah data, saya tidak peduli dengan output apa pun.

Chris
sumber

Jawaban:

244

Untuk menonaktifkan pagination tetapi mempertahankan output, gunakan:

\pset pager off

Untuk mengingat pengaturan ini, tambahkan ke ~ / .psqlrc Anda .

Lihat manual psql .

Pada Pg versi yang lebih lama, itu hanya beralih, jadi \pset pager

Untuk sepenuhnya menekan output kueri, gunakan \o /dev/nulldalam psqlskrip Anda .

Untuk menekan psqlkeluaran informasi, jalankan dengan -qatau atur QUIET=1di lingkungan.


Untuk menghasilkan hasil dan membuangnya, Anda dapat mengarahkan ulang stdoutke /dev/nulldengan:

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

Anda dapat mengarahkan ulang stdout dan stderr dengan:

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

tapi saya tidak merekomendasikan itu, karena itu akan membuang informasi kesalahan yang mungkin memperingatkan Anda ada sesuatu yang tidak beres. Anda juga menghasilkan hasil dan membuangnya, yang tidak efisien; Anda lebih baik hanya tidak memproduksinya dengan menyesuaikan pertanyaan Anda.

Craig Ringer
sumber
Itu menghentikannya menggunakan pager tetapi tidak menghentikan output, bukan? Saya kira Anda harus PAGER="/dev/null" psql db -P pager=always -f sql.sqlmembuatnya selalu mematikan output.
Harald Brinkhof
112

Saya mencari ini juga, saya menemukan cara dalam pertanyaan serupa di ServerFault:

psql -P pager=off <other params>

mematikan hal paging, tanpa menekan output.

Davide
sumber
4
Jawaban ini lebih bermanfaat daripada apa pun tentang -P di halaman manual. Terima kasih!
nortally
itulah tepatnya yang saya butuhkan. Terima kasih :)
Pradip Das
13

Ini pilihan lain. Itu memang memiliki keuntungan bahwa Anda tidak harus mengingat nama opsi psql, dll.

psql ... | cat
FMc
sumber
protip absolut! +1
sjas
11

bash, sebagai sebuah shell , memiliki 2 aliran, Anda dapat mengarahkan ulang data keluaran itu: stdout dan stderr, karena keluaran ini perlu diarahkan ke suatu tempat, linux memiliki simpul 'buang semuanya' yang dapat dicapai melalui / dev / null . Semua yang Anda kirim ke sana akan hilang begitu saja.

(kerang juga memiliki aliran input tetapi saya akan mengabaikan ini di sini karena Anda meminta untuk menekan output)

Aliran ini diwakili oleh angka: 1 untuk stdout dan 2 untuk stderr.

Jadi, jika Anda ingin mengarahkan ulang stdout, Anda akan melakukannya dengan operator <dan >(pada dasarnya menunjuk ke tempat data mengalir)

misalkan kita ingin menekan stdout (redirect ke / dev / null):

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

Seperti yang Anda lihat ini stdout adalah default, tidak ada nomor aliran yang digunakan jika Anda ingin menggunakan nomor aliran yang akan Anda tulis

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

Sekarang jika Anda ingin menekan stderror (streaming nomor 2), Anda akan menggunakannya

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

Anda juga dapat mengalihkan satu aliran ke aliran lain, misalnya stderror ke stdout, yang berguna jika Anda ingin menyimpan semua output di suatu tempat, reguler dan kesalahan.

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

Pikiran Anda tidak mungkin ada ruang antara 2>&1

Akhirnya dan terkadang yang paling menarik adalah fakta bahwa Anda dapat menekan semua output dengan menggunakan &>, karena ketika Anda menginginkannya 'sangat sunyi'

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

Harald Brinkhof
sumber
1
Walaupun info ini pada prinsipnya suara, itu tidak berfungsi sama sekali dalam kasus khusus ini, karena psql tidak mengirim pesan informatif ke stderr. Mereka berbaur dengan data di stdout.
Jonathan Hartley
Tiba-tiba saya menyadari bahwa poin Anda adalah bahwa case '&>' final dapat digunakan oleh OP untuk menghentikan pager, dengan menekan semua output. Saya akan menghapus downvote saya jika Anda mengubah jawaban Anda dengan cara apa pun.
Jonathan Hartley
4
psql db -f sql.sql > /dev/null
Marc B
sumber