Следуйте по трубе, используя меньше?

25

Может ли меньше следовать (нажатием F) ввод по каналу (аналогично файлу)? Для файла, в который выполняется запись, команда

less <file>

будет следовать за файлом при нажатии F.

Но если у меня есть команда, которая выводит каналы напрямую в меньшее, как это

command | less

нажатие F ничего не сделает.

Таким образом, похоже, что трубы не могут следовать как файлы? Или, может быть, это связано с командой, также пишущей в STDERR? Эффект, которого я пытаюсь добиться, всегда видеть последний результат команды: как удерживать нажатой PageDown!

Связанное замечание справедливо и для G (перейти к концу): при прямом переходе к меньшему количеству это не сработает.

haelix
источник

Ответы:

21

Нажатие Fили Gзаставляет lessпопытаться достичь ввода EOF. Если вход представляет собой трубу, lessзависает до тех пор , пока труба не будет закрыта с другой стороны (и не "ничего не делает").

Это можно обойти, сохранив вывод команды во временном файле в фоновом режиме, а затем используя его в качестве входных данных для less:

command > /tmp/x &
less +F /tmp/x; kill %; rm /tmp/x

Там нет возможности сделать это lessтолько; Тем не менее, я признаю, что это было бы полезно.

МИК
источник
Если вход представляет собой трубу, lessзависает, пока труба не будет закрыта с другой стороны . Это своего рода вводящее в заблуждение утверждение. Что происходит, что меньше вызовов readв режиме блокировки, ожидая новые данные или или закрытие трубы.
Петр Доброгост
3
После нажатия F или G на канальном входе lessблокирующее чтение не только выполняется, но и выполняется в цикле, ожидая EOF. И EOF на трубе происходит, только если ее другая сторона закрыта.
Мик
3
Если lessбы обновить экран в этом цикле, не было бы проблемы. Блокировка чтения имеет мало общего с этой проблемой.
Мик
1
@Flow - это не зависание, о котором шла речь, а просто ожидание, которое ожидается в этой ситуации - ожидание большего количества данных в файле при достижении EOF (что, кстати, не произойдет для закрытого канала), или для прерывания, чтобы выйти из режима следования
Мик
1
@PiotrDobrogost с блокировкой чтения lessне сможет обновить экран, если нет данных; когда появятся некоторые данные, блокировка чтения вернет их и lessсможет обновить экран без отдельного потока
mik
6

Может ли меньше следовать (нажатием F) ввод по каналу (аналогично файлу)?

Да, начиная с версии 474. Однако это не упоминается в примечаниях к выпуску ни одной версии, поскольку в настоящее время существует еще одна проблема с этой функцией. Ниже приводится комментарий от сопровождающего менее - Марк Нудельман:

Что касается команды F на каналах, это также исправлено в less-474. Вместо поиска EOF, команда F ищет конец буферизованного ввода и начинает читать там. Однако это не очень удобно, потому что когда вы нажимаете CTRL-C, чтобы остановить команду F, это убивает процесс, производящий вывод. Я не уверен, как это исправить.

Пока эта проблема не устранена за меньшее время, можно обойти ее, используя функции оболочки. См. Мой ответ на вопрос: есть ли способ выйти из режима «меньше», не останавливая другие процессы в конвейере? вопрос для деталей.

Для справки: проблема, связанная с тем, что F не работает с трубами, имеет номер 300 в списке известных ошибок и называется « Команда F не работает с вводом по конвейеру».


Связанное замечание справедливо и для G (перейти к концу): при прямом переходе к меньшему количеству это не сработает.

Работает начиная с версии 466. Ссылаясь на заметки о выпуске для этой версии:

Новая команда ESC-G завершает буферизованные данные в канале

Петр Доброгост
источник
Команда ESC-G была представлена ​​в версии 466, выпущенной 23 августа 2014 года.
mik
@mik Похоже, ошибка в примечаниях к выпуску для версии 471. Спасибо, исправлено.
Петр Доброгост
Не ошибка, они просто перечисляют изменения постепенно начиная со стабильной версии, в данном случае версии 458. Однако, нет стабильного выпуска с командой ESC-G.
Мик
Команда ESC-G теперь находится в стабильном выпуске (481): «16 октября 2015 г. less-481 был выпущен для общего использования».
Мик
Обновление: Что касается команды F на каналах, это также исправлено в less-474. Вместо поиска EOF, команда F ищет конец буферизованного ввода и начинает читать там. Однако это не очень удобно, потому что когда вы нажимаете ctrl-C, чтобы остановить команду F, это убивает процесс, производящий вывод. Я не уверен, как это исправить. - Марк Нудельман, сопровождающий меньше
Петр Доброгост
2

Из менее справочной страницы

[Keyboard] COMMANDS [...]

   F      Scroll  forward, and keep trying to read when the end of file is reached.  Normally this command would be used when already
          at the end of the file.  It is a way to monitor the tail of a file which is growing while it is being viewed.  (The  behav‐
          ior is similar to the "tail -f" command.)

так что это должно работать, и это на самом деле работает для меня.

artistoex
источник
1
Эта команда ведет себя по-разному при использовании с pipe, как описано @mik, и явно не то, что ищет OP.
Петр Доброгост