Меньше мешает меньше


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.


В свете проблемы, поднятой OP, кажется, что решение использовать CTRL + C как способ меньше прерывать очень неудачно. Знаете ли вы, почему этот конкретный сигнал был выбран? Будет ли какой-то другой сигнал менее проблематичным?
Петр Доброгост

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

Кажется, что проблема вызвана использованием сигнала для прерывания меньше. Вместо этого, если бы это был какой-то нормальный ключ / ярлык, у нас не было бы проблемы во-первых. Однако я предполагаю, что необходимость в сигнале возникает из-за того, что процесс не может selectждать ввода одновременно из файла / канала и терминала.
Петр Доброгост

@PiotrDobrogost: может, так Fработает режим (follow). Трубы и т. П. Одинаково.
user1686

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

9

Вы можете отключить номера строк с помощью

   -n or --line-numbers

вариант.

produce_output | less -n

-1: может решить подстрекательскую проблему OP, но ничего не делает для ответа на фактический вопрос OP (т. Е. Прерывание процесса).
goldPseudo

2
Извините, но начинать меньше с ненужной функции, а затем попытаться отправить сигнал на отключение функции, которую можно отключить с помощью переключателя, - это обходной путь, а не решение. Конечно, решение @grawity - это хорошо (и я проголосовал за него), но давай: запуск первого процесса в другой группе, чтобы иметь возможность отправить сигнал для прерывания задачи (подсчет строк), которая не нужна, на самом деле тоже немного много работы.
Маттео

1
Это справедливое решение проблемы, которую я поставил в своем вопросе. Однако прерывания останавливают больше, чем просто подсчет строк за меньшее время - например, они также прерывают длинный поиск. Таким образом, решение @ grawity является предпочтительным, поскольку оно будет охватывать любое использование прерываний в меньшем количестве. Мой плохой за то, что не обратился к этому более четко в вопросе
Эд Макман

@EdMcMan Конечно, я также выбрал решение гравитации, и я счастлив узнать что-то новое, что всегда может быть полезным.
Маттео

0

Работая с большими объемами вывода, я нашел очень полезным отправить вывод в файл и использовать tail -fили less +Fдля просмотра, например:

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

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

Обратите внимание, что это 2>&1может быть связано с Bash (я не уверен). Убедитесь, что у вас достаточно места на диске для выходного файла :-)


Хвост просто покажет вам файл, Эд указал, что он использует менее интерактивно (например, он должен искать в файле)
Matteo

2>&1это POSIX, голый >&это башизм.
user1686

FWIW, 2> & 1 также работает в Windows XP, 7, 2008 и т. Д.
jftuga

@Matteo: да, я должен был использовать less +Fв моем примере; Я только что обновил свой ответ.
Джренни

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).
Джренни

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.