Как мне закрыть «меньше» снаружи, не оставляя мой терминал в беспорядке?

296
Hubro

Я пишу утилиту, которая автоматически запускается lessкак подкоманда с ее выводом. Иногда возникает ошибка при записи вывода, и я хотел бы автоматически закрыть lessи нормально отобразить ошибку. Однако, независимо от того, какой сигнал я пытаюсь отправить lessпроцессу, он либо игнорирует его, либо закрывает «нечисто», т. Е. Оставляет мой терминал непригодным для использования. (Однако я могу исправить терминал, нажав Ctrl+ Cи написав (вслепую) команду stty sane.)

Я перепробовал все «обычные» сигналы: SIGINT, SIGTERM, SIGQUITи SIGKILL. Последний явно не сработает, но я все равно попробовал. Я не могу найти ничего о сигналах на страницах справочника для less.

Можно ли выйти lessчисто снаружи?

4
Вы можете использовать fifo в качестве входных данных для меньшего конца и написать «q», когда хотите выйти. Julian F. Weinert 7 лет назад 0
@ JulianF.Weinert Но я уже использую stdin of less для подачи текста. Тем не менее, я не уверен, насколько меньше получает ввод с моей клавиатуры, когда ее стандартный ввод используется для чего-то еще ... Hubro 7 лет назад 0
Что делать, если вы кормите это "д"? Julian F. Weinert 7 лет назад 0

1 ответ на вопрос

1
meuh

В зависимости от настроек управления заданиями, вы можете быть в состоянии выдать первую kill -tstpв lessпрограмму, а затем kill -9. Первый сигнал перехватывается lessи заставляет его восстанавливать tty перед повторной выдачей сигнала на себя, что обычно заставляет его остановиться в фоновом режиме. Однако, если обработчик по умолчанию для SIGTSTP игнорирует его, lessон просто продолжит работу и снова установит для терминала значение raw.

Вы можете рассмотреть возможность запуска lessв отдельном терминале, например xterm -e sh -c "less /myfile", тогда вы можете сделать kill -9это без необходимости очистки.

Вы также можете запустить less --quit-on-intr(или -K), и тогда он будет корректно завершен в SIGINT, хотя это также повлияет на ваше обычное взаимодействие с выходным потоком.

В противном случае просто stty sane; tput resetвведите после вашей команды kill.

Похожие вопросы