PostgreSQL daha fazla çıktıyı devre dışı bırakır


148

PostgreSQL sunucumda bir komut dosyası çalıştırıyorum:

psql db -f sql.sql

dan bashveya içinde cronkomut dosyası.

Çıktıyı moreveya ile sayfalandırmaya çalışıyor less.

Sonuç sayfalandırmasını nasıl devre dışı bırakırım psql?

Tek yapmak istediğim verileri değiştirmek, herhangi bir çıktı umurumda değil.

Yanıtlar:


251

Sayfalandırmayı devre dışı bırakmak ancak çıktıyı korumak için şunu kullanın:

\pset pager off

Bu ayarı hatırlamak için ~ / .psqlrc dosyanıza ekleyin .

Psql kılavuzuna bakın .

Pg'nin eski sürümlerinde bu sadece bir geçişti, bu nedenle \pset pager

Sorgu çıktısını tamamen bastırmak \o /dev/nulliçin psqlkomut dosyanızı kullanın .

Bilgisel psqlçıktısını bastırmak için , birlikte çalıştırın -qveya QUIET=1ortama ayarlayın .


Sonuçlar üretmek ve onları atmak için, yönlendirebilirsiniz stdoutiçin /dev/nullbirlikte:

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

Hem stdout hem de stderr'i şu şekilde yeniden yönlendirebilirsiniz:

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

ancak, sizi bir şeylerin yolunda gitmediğini uyarabilecek hata bilgilerini atacağı için bunu önermiyorum. Ayrıca sonuçlar üretiyor ve onları çöpe atıyorsunuz, ki bu verimsizdir; ilk etapta sorgularınızı ayarlayarak üretmemek daha iyidir.


Bu, çağrı cihazı kullanmasını durdurur ama çıktıyı durdurmaz, değil mi? Sanırım PAGER="/dev/null" psql db -P pager=always -f sql.sqlher zaman çıktıyı öldürmen gerekecek .
Harald Brinkhof

116

Ben de bunu arıyordum , ServerFault'ta benzer bir soruda yolu buldum :

psql -P pager=off <other params>

çıktıyı bastırmadan sayfalama şeyini kapatır.


4
Bu cevap, man sayfalarındaki -P ile ilgili her şeyden daha yararlıydı. Teşekkürler!
kuzeyde

tam olarak ihtiyacım olan şey bu. Teşekkürler :)
Pradip Das

13

İşte başka bir seçenek. Psql seçenek adlarını vb. Hatırlamak zorunda olmamanız avantajına sahiptir.

psql ... | cat

mutlak protip! +1
sjas

11

bash, bir kabuk olduğundan , bu çıktı verilerini yeniden yönlendirebileceğiniz 2 akışa sahiptir : stdout ve stderr, çünkü bu çıktının bir yere yeniden yönlendirilmesi gerekir, linux / dev / null aracılığıyla erişilebilen belirli bir 'her şeyi at' düğümü vardır . Oraya gönderdiğiniz her şey boşluğun içinde kaybolacak.

(kabukların da bir giriş akışı vardır, ancak çıktının bastırılmasını istediğiniz için burada bunu göz ardı edeceğim)

Bu akışlar sayılarla temsil edilir: stdout için 1 ve stderr için 2.

Yani, sadece stdout'u yeniden yönlendirmek istiyorsanız, bunu <ve >operatörleriyle yaparsınız (temelde işaret ettiği yer, verilerin aktığı yerdir)

standart çıktıyı bastırmak istediğimizi varsayalım (/ dev / null'a yönlendirin):

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

Gördüğünüz gibi standart çıktı varsayılandır, yazacağınız akış numarasını kullanmak isterseniz hiçbir akış numarası kullanılmamıştır.

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

Şimdi, gerilimi (akış numarası 2) bastırmak istiyorsanız,

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

Ayrıca bir akışı diğerine, örneğin stderror'dan stdout'a yeniden yönlendirebilirsiniz; bu, tüm çıktıları bir yerde, normal ve hataları kaydetmek istiyorsanız kullanışlıdır.

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

Aralarında boşluk kalmamasına dikkat et 2>&1

Son olarak ve bazen en ilginç olanı, &>'tamamen sessiz' olmasını istediğinizde, kullanarak tüm çıktıları bastırabilmenizdir.

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


1
Bu bilgi prensipte sağlam olsa da, bu özel durumda hiç çalışmaz, çünkü psql bilgilendirici mesajları stderr'e göndermez. Standart çıktıdaki verilerle karıştırılırlar.
Jonathan Hartley

Birden farkettim ki, son '&>' durumunun OP tarafından tüm çıktıları bastırarak çağrı cihazını durdurmak için kullanılabileceğini anladım. Cevabınızı herhangi bir şekilde değiştirirseniz, olumsuz oyumu kaldırırım.
Jonathan Hartley


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.