Ít gián đoạn trong ít hơn


13

Tôi thường đầu ra chương trình ống ít hơn, ví dụ

produce_output | less

Điều này hoạt động tuyệt vời, cho đến khi produce_outputsản xuất một lượng lớn đầu ra. Nếu tôi tìm kiếm một số văn bản nằm sâu trong tệp, ít báo cáo hơn

Calculating line numbers... (interrupt to abort)

Nếu tôi ngắt với Control + C, nó cũng sẽ giết produce_output, điều đó ngăn nó tạo ra đầu ra tiếp theo. Có cách nào để gửi ngắt đến ít hơn, để produce_outputtiếp tục chạy không?

Tôi biết rằng tôi có thể sử dụng kill -INT less_process, nhưng tôi nghĩ phải có một giải pháp tốt hơn.

Câu trả lời:


15

Thông thường tất cả các quy trình trong một đường ống chạy trong cùng một nhóm quy trình , khiến tất cả chúng nhận được tín hiệu. Bạn có thể sử dụng setsid foo | lessđể chạy footrong một pgrp khác.


Có vẻ như vấn đề do OP nêu ra, dường như quyết định sử dụng CTRL + C như một cách để làm gián đoạn ít hơn là rất đáng tiếc. Bạn có biết tại sao tín hiệu cụ thể này được chọn? Một số tín hiệu khác sẽ ít vấn đề hơn?
Piotr Dobrogost

@PiotrDobrogost: Bạn muốn đề xuất tín hiệu nào khác? Không có nhiều phím tắt chuyên dụng, chỉ có SIGINT (Ctrl-C) và SIGQUIT (Ctrl- \), và cái sau có nghĩa là thoát khỏi chương trình ngay lập tức, không chỉ đơn thuần là ngắt. Phần còn lại chỉ có sẵn thông qua kill.
dùng1686

Có vẻ như vấn đề là do sử dụng tín hiệu để ngắt ít hơn. Thay vào đó, nếu đó là một số phím / phím tắt bình thường, chúng tôi sẽ không gặp vấn đề ở nơi đầu tiên. Tuy nhiên, tôi đoán rằng nhu cầu về tín hiệu xuất phát từ thực tế là quá trình không thể sử dụng selectđể chờ đầu vào cả từ tệp / ống và thiết bị đầu cuối cùng một lúc.
Piotr Dobrogost

@PiotrDobrogost: Có thể, đó là cách Fchế độ (theo) hoạt động. Ống và ttys có thể gây ô nhiễm theo cùng một cách.
dùng1686

Tại sao bạn nghĩ rằng đó là cách làm theo chế độ? Tôi nghĩ rằng dòng sự kiện là shell nhận được CTRL + C và gửi tín hiệu SIGINT đến ít hơn, tín hiệu này không đồng bộ mà không cần nghe bàn phím / thiết bị đầu cuối.
Piotr Dobrogost

9

Bạn có thể vô hiệu hóa số dòng với

   -n or --line-numbers

Lựa chọn.

produce_output | less -n

-1: có thể giải quyết vấn đề xúi giục của OP, nhưng không có gì để trả lời câu hỏi thực tế của OP (nghĩa là làm gián đoạn một quá trình).
goldPseudo

2
Xin lỗi nhưng bắt đầu ít hơn với một tính năng không mong muốn và sau đó cố gắng gửi tín hiệu để vô hiệu hóa một tính năng bạn có thể vô hiệu hóa bằng một công tắc là một cách giải quyết và không phải là một giải pháp. Tất nhiên giải pháp @grawity là tốt (và tôi đã bình chọn nó) nhưng thôi: bắt đầu quá trình đầu tiên trong một nhóm khác để có thể gửi tín hiệu để làm gián đoạn một nhiệm vụ (đếm dòng) không cần thiết thực sự là một chút quá nhiều việc.
Matteo

1
Đây là một giải pháp công bằng cho vấn đề tôi đặt ra trong câu hỏi của mình. Tuy nhiên, các ngắt dừng nhiều hơn chỉ là dòng đếm ít hơn - ví dụ, chúng cũng sẽ làm gián đoạn một tìm kiếm dài. Vì vậy, giải pháp của @ grawity được ưa thích hơn, vì nó sẽ bao gồm mọi hoạt động sử dụng ngắt ít hơn. Xấu của tôi vì đã không giải quyết điều này rõ ràng hơn trong câu hỏi!
Ed McMan

@EdMcMan Chắc chắn tôi cũng đã bình chọn giải pháp của lực hấp dẫn và tôi rất vui khi biết được điều gì đó mới luôn có thể hữu ích.
Matteo

0

Khi làm việc với số lượng lớn đầu ra, tôi thấy rất hữu ích khi gửi đầu ra đến một tệp và sử dụng tail -fhoặc less +Fđể xem, ví dụ:

produce_output > out 2>&1 & less +F out

Các 2>&1cú pháp đảm bảo rằng cả hai stdout và stderr đi đến out--- remove rằng nếu bạn chỉ muốn stdout sẽ tập tin. Bằng cách này, bạn có thể kiểm tra đầu ra theo nhiều cách khác nhau (thậm chí từ một máy khác) mà không phải gặp rắc rối với chương trình sản xuất đầu ra.

Lưu ý rằng 2>&1có thể là bash-cụ thể (tôi không chắc chắn). Hãy chắc chắn rằng bạn có đủ dung lượng đĩa cho tệp đầu ra :-)


Tail sẽ chỉ cho bạn xem tệp, Ed chỉ định rằng anh ta đang sử dụng ít tương tác hơn (ví dụ: anh ta phải tìm kiếm trong tệp)
Matteo

2>&1là POSIX, trần >&là một bashism.
dùng1686

FWIW, 2> & 1 cũng hoạt động trên Windows XP, 7, 2008, v.v.
jftuga

@Matteo: vâng, tôi nên sử dụng less +Ftrong ví dụ của mình; Tôi chỉ cập nhật câu trả lời của tôi.
jrennie

1
@Matteo: Đếm dòng không phải là vấn đề tương tự less +F(vì less +Fxử lý dữ liệu khi nó được tạo). Ví dụ tôi đưa ra không có vấn đề giống như được đăng ban đầu: ctrl + c sẽ không làm gián đoạn process_output. Nếu chúng ta không chăm sóc cho 'làm theo' chức năng, người ta có thể chạy produce_output > out 2>&1, sau đó less out. Một vấn đề với produce_output | lesslà nếu bất cứ thứ gì phá vỡ đường ống (ví dụ như vô tình nhấn 'q' từ đó less) thì produce_outputsẽ chết (nếu không xử lý SIGPIPE đặc biệt).
jrennie

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.