PostgreSQL vô hiệu hóa đầu ra nhiều hơn


146

Tôi đang chạy một tập lệnh trên máy chủ PostgreSQL của mình:

psql db -f sql.sql

từ bashhoặc trong một cronkịch bản.

Nó tiếp tục cố gắng phân trang đầu ra với morehoặc less.

Làm thế nào để tôi vô hiệu hóa phân trang kết quả trong psql?

Tất cả những gì tôi muốn làm là thay đổi dữ liệu, tôi không quan tâm đến bất kỳ đầu ra nào.

Câu trả lời:


244

Để vô hiệu hóa phân trang nhưng giữ lại đầu ra, sử dụng:

\pset pager off

Để ghi nhớ cài đặt này, hãy thêm nó vào ~ / .psqlrc .

Xem hướng dẫn sử dụng psql .

Trên các phiên bản cũ hơn của PG, nó chỉ là một sự thay đổi, vì vậy \pset pager

Để loại bỏ hoàn toàn đầu ra truy vấn, sử dụng \o /dev/nulltrong psqltập lệnh của bạn .

Để chặn psqlđầu ra thông tin của nó, hãy chạy nó -qhoặc đặt QUIET=1trong môi trường.


Để tạo kết quả và ném chúng đi, bạn có thể chuyển hướng stdoutđến /dev/nullvới:

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

Bạn có thể chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn với:

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

nhưng tôi không khuyến nghị điều đó, vì nó sẽ loại bỏ thông tin lỗi có thể cảnh báo bạn điều gì đó không ổn. Bạn cũng tạo ra kết quả và ném chúng đi, điều này không hiệu quả; tốt hơn hết là bạn không nên sản xuất chúng ngay từ đầu bằng cách điều chỉnh các truy vấn của mình.


Điều đó ngăn nó sử dụng máy nhắn tin nhưng nó không dừng đầu ra, phải không? Tôi đoán bạn cần PAGER="/dev/null" psql db -P pager=always -f sql.sqlphải làm cho nó luôn giết đầu ra.
Harald Brinkhof

112

Tôi cũng đang tìm kiếm điều này, tôi đã tìm thấy cách trong một câu hỏi tương tự trên ServerFault:

psql -P pager=off <other params>

tắt điều phân trang, mà không ngăn chặn đầu ra.


4
Câu trả lời này hữu ích hơn bất cứ điều gì về -P trong các trang nam. Cảm ơn!
miền bắc

đó là những gì tôi cần chính xác. Cảm ơn :)
Pradip Das

13

Đây là một lựa chọn khác. Nó có lợi thế là bạn không cần phải nhớ tên tùy chọn psql, v.v.

psql ... | cat

protip tuyệt đối! +1
sjas

11

bash, là một shell , có 2 luồng bạn có thể chuyển hướng dữ liệu đầu ra đó: stdout và stderr, bởi vì đầu ra này cần được chuyển hướng ở đâu đó, linux có một nút 'loại bỏ mọi thứ' cụ thể có thể truy cập thông qua / dev / null . Tất cả mọi thứ bạn gửi ở đó sẽ biến mất vào khoảng trống.

(shell cũng có một luồng đầu vào nhưng tôi sẽ bỏ qua điều này ở đây vì bạn đã yêu cầu triệt tiêu đầu ra)

Các luồng này được biểu thị bằng các số: 1 cho thiết bị xuất chuẩn và 2 cho thiết bị xuất chuẩn.

Vì vậy, nếu bạn muốn chuyển hướng chỉ ra thiết bị xuất chuẩn, bạn sẽ làm điều đó với các toán tử <>toán tử (về cơ bản nơi nó trỏ đến là nơi dữ liệu chảy đến)

giả sử chúng tôi muốn chặn thiết bị xuất chuẩn (chuyển hướng đến / dev / null):

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

Như bạn có thể thấy đây là thiết bị xuất chuẩn là mặc định, không có số luồng nào được sử dụng nếu bạn muốn sử dụng số luồng bạn viết

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

Bây giờ nếu bạn muốn chặn stderror (luồng số 2), bạn sẽ sử dụng

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

Bạn cũng có thể chuyển hướng một luồng này sang luồng khác, ví dụ như stderror sang stdout, rất hữu ích nếu bạn muốn lưu tất cả đầu ra ở đâu đó, thường xuyên và lỗi.

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

nhớ rằng bạn không thể có khoảng cách giữa 2>&1

Cuối cùng và đôi khi thú vị nhất là việc bạn có thể triệt tiêu tất cả đầu ra bằng cách sử dụng &>, khi bạn muốn nó 'hoàn toàn yên tĩnh'

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


1
Mặc dù thông tin này là nguyên tắc, nhưng nó hoàn toàn không hoạt động trong trường hợp cụ thể này, vì psql không gửi các thông báo thông tin đến stderr. Chúng được xen kẽ với dữ liệu trên thiết bị xuất chuẩn.
Jonathan Hartley

Đột nhiên tôi nhận ra rằng quan điểm của bạn là trường hợp '&>' cuối cùng có thể được OP sử dụng để dừng máy nhắn tin, bằng cách triệt tiêu tất cả đầu ra. Tôi sẽ xóa downvote của tôi nếu bạn sửa đổi câu trả lời của mình bằng mọi cách.
Jonathan Hartley


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.