Менше перебиваючи менше


13

Я часто передаю програму на менше, наприклад,

produce_output | less

Це чудово працює, поки не produce_outputвиробляються великі обсяги продукції. Якщо я шукаю якийсь текст, який знаходиться у файлі, менше звітів

Calculating line numbers... (interrupt to abort)

Якщо я перериваю з Control + C, він також вбиває produce_output, що не дозволяє виробляти подальший вихід. Чи є спосіб переслати переривання менше, щоб це produce_outputпродовжувало працювати?

Я знаю, що міг би скористатися kill -INT less_process, але думаю, що повинно бути краще рішення.

Відповіді:


15

Зазвичай всі процеси в трубопроводі протікають в одній групі процесів , внаслідок чого всі вони отримують сигнал. Ви можете використовувати setsid foo | lessдля запуску fooв іншому pgrp.


Зважаючи на проблему, поставлену ОП, видається, що рішення використовувати CTRL + C як спосіб перервати менше дуже прикро. Чи знаєте ви, чому саме цей сигнал був обраний? Чи буде якийсь інший сигнал менш проблематичним?
Пьотр Доброгост

@PiotrDobrogost: Який ще сигнал ви б запропонували? Не так багато людей, які мають спеціальні комбінації клавіш, лише SIGINT (Ctrl-C) і SIGQUIT (Ctrl- \), і остання призначена для негайного виходу з програми, а не просто переривання. Решта доступні лише через kill.
користувач1686

Здається, що проблема викликана тим, що менше використовується сигнал для переривання. Натомість, якби це була звичайна клавіша / ярлик, ми б не мали проблеми в першу чергу. Однак я думаю, що потреба в сигналі пов'язана з тим, що процес не selectможе чекати введення одночасно з файлу / труби та терміналу.
Пьотр Доброгост

@PiotrDobrogost: Це може, саме так Fпрацює режим (follow). Труби та штамби запиляються однаково.
користувач1686

Чому ви вважаєте, що саме так працює режим слідування? Я думаю, що потік подій полягає в тому, що оболонка отримує CTRL + C і посилає сигнал SIGINT менше, який отримує цей сигнал асинхронно, не слухаючи клавіатуру / термінал.
Пьотр Доброгост

9

Ви можете відключити номери рядків за допомогою

   -n or --line-numbers

варіант.

produce_output | less -n

-1: може вирішити підбурюючу проблему ОП, але нічого не дає відповіді на актуальне питання ОП (тобто переривання процесу).
золотоПсевдо

2
Вибачте, але починаючи менше з непотрібної функції, а потім спробуйте надіслати сигнал, щоб вимкнути функцію, яку ви можете відключити за допомогою перемикача, це рішення, а не рішення. Звичайно, рішення @grawity приємне (і я його проголосував), але давай: запустити перший процес в іншій групі, щоб мати можливість відправити сигнал для переривання завдання (підрахунку рядків), який не потрібен, насправді теж небагато багато роботи.
Маттео

1
Це справедливе рішення проблеми, яку я поставив у своєму питанні. Однак переривання зупиняють більше, ніж просто підрахунок рядків менше - наприклад, вони також перервуть тривалий пошук. Отже, рішення @ grawity є кращим, оскільки воно охоплюватиме будь-яке використання переривань менше. Моє погано, що я не вирішував це питання чіткіше в питанні!
Ед Макман

@EdMcMan Впевнений, що я також проголосував рішення гравітації, і я радий дізнатися щось нове, що завжди може бути корисним.
Маттео

0

Працюючи з великою кількістю результатів, я вважаю дуже корисним відправити вихід у файл і використовувати tail -fабо less +Fпереглядати, наприклад:

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

2>&1Синтаксис переконується , що і стандартний висновок і стандартний потік помилок перейти до out--- видалити , що якщо ви хочете тільки стандартний висновок збирається в файл. Таким чином, ви можете перевірити вихід різними способами (навіть з іншої машини), не маючи возитися з програмою, що виробляє вихід.

Зверніть увагу, що це 2>&1може бути специфічно для bash (я не впевнений). Будьте впевнені, що у вас є достатньо місця на диску для вихідного файлу :-)


Хвіст просто покаже вам файл, Ед зазначив, що він використовує менш інтерактивно (наприклад, він повинен шукати у файлі)
Маттео

2>&1є POSIX, голий >&- це башизм.
користувач1686

FWIW, 2> & 1 також працює на Windows XP, 7, 2008 тощо.
jftuga

@Matteo: так, я мав би використати less +Fу своєму прикладі; Я щойно оновив свою відповідь.
jrennie

1
@Matteo: Підрахунок рядків - це не та сама проблема less +F(оскільки less +Fобробляє дані, як вони генеруються). Приклад, який я наводив, не має тієї самої проблеми, що спочатку розміщено: ctrl + c не перерветься process_output. Якщо хтось не піклується про функцію "слідкувати" produce_output > out 2>&1, тоді можна запустити less out. Проблема produce_output | lessполягає в тому, що якщо що-небудь зламає трубу (наприклад, випадково потрапив на «q» від less), то produce_outputвін загине (без спеціальних операцій SIGPIPE).
jrennie

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.