PostgreSQL ปิดการใช้งานเอาต์พุตเพิ่มเติม


146

ฉันใช้งานสคริปต์บนเซิร์ฟเวอร์ PostgreSQL ของฉัน:

psql db -f sql.sql

จากbashหรือในcronสคริปต์

มันทำให้ความพยายามที่จะให้เลขหน้าการส่งออกด้วยหรือmoreless

ฉันจะปิดใช้งานการแบ่งหน้าผลลัพธ์ได้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กำจัดมันให้หมด
Harald Brinkhof

112

ฉันกำลังมองหาสิ่งนี้เช่นกันฉันพบวิธีในคำถามที่คล้ายกันใน ServerFault:

psql -P pager=off <other params>

ปิดสิ่งที่เพจจิ้งโดยไม่หยุดเอาต์พุต


4
คำตอบนี้มีประโยชน์มากกว่าอะไรเกี่ยวกับ -P ใน man pages ขอบคุณ!
2559

นั่นคือสิ่งที่ฉันต้องการอย่างแน่นอน ขอบคุณ :)
Pradip Das

13

นี่คือตัวเลือกอื่น มันมีข้อดีที่คุณไม่ต้องจำชื่อตัวเลือก psql ฯลฯ

psql ... | cat

protip แน่นอน! +1
sjas

11

ทุบตีเป็นเปลือกมี 2 ลำธารคุณสามารถเปลี่ยนเส้นทางที่ข้อมูลออก: stdout และ stderr เพราะความต้องการส่งออกไปยังถูกเปลี่ยนเส้นทางไปที่ไหนสักแห่งลินุกซ์มีเฉพาะ 'ทิ้งทุกอย่าง' โหนดสามารถเข้าถึงได้ผ่าน/ 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
Jonathan Hartley

ทันใดนั้นฉันก็รู้ว่าประเด็นของคุณคือว่ากรณี & ls; สุดท้ายสามารถใช้โดย OP เพื่อหยุดเพจเจอร์โดยการระงับการส่งออกทั้งหมด ฉันจะลบ downvote ของฉันหากคุณแก้ไขคำตอบของคุณในทางใดทางหนึ่ง
Jonathan Hartley


2
psql -U user -P pager=off -d database -c 'SQL';

2
โดยปกติแล้วจะเป็นการดีกว่าที่จะอธิบายวิธีแก้ปัญหาแทนที่จะเพียงแค่โพสต์แถวของรหัสที่ไม่ระบุชื่อ คุณสามารถอ่านฉันจะเขียนคำตอบที่ดีได้อย่างไรและอธิบายคำตอบที่ใช้รหัสทั้งหมด
Anh Pham
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.