Слідкуйте за трубою, використовуючи менше?


25

Чи можна менше (натискаючи клавішу F) слідувати по вхідному каналу (подібно до файлу)? Для файлу, який записується, команда

less <file>

буде натискати файл при натисканні F.

Але якщо у мене є команда, що труби виводяться безпосередньо на менше, як це

command | less

натискання клавіші F нічого не призведе.

Отже, схоже, що за трубами не можна керуватися, як файли? А може, це пов’язано з командою також записом до STDERR? Ефект, який я намагаюся досягти, завжди бачить останній результат команди: так само, як і натискання PageDown!

Пов’язане зауваження стосується G (переходити до кінця): якщо трубопровід безпосередньо в менший, він не працюватиме.


Відповіді:


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 (що, до речі, не станеться для закритої труби), або для перерви для виходу з режиму слідування
mik

1
@PiotrDobrogost з блокуванням читання lessне зможе оновити екран, якщо немає даних; коли з’являться деякі дані, блокування прочитаного поверне його, і lessвін зможе оновити екран без окремої нитки
mik

6

Чи можна менше (натискаючи клавішу F) слідувати по вхідному каналу (подібно до файлу)?

Так, починаючи з версії 474. Однак це не згадується в нотатках до випуску жодної версії, оскільки наразі існує одна проблема з цією функцією. Нижче наведено коментар від підтримуючого персоналу - Марка Нудельмана:

Що стосується команди F на трубах, то це також фіксується менш-474. Замість того, щоб шукати EOF, команда F прагне до кінця буферного введення і починає читати там. Однак це не дуже корисно, оскільки коли ви натискаєте CTRL-C, щоб зупинити команду F, це вбиває процес отримання результату. Я не впевнений, як це виправити.

Доки ця проблема не буде виправлена ​​менше, її можна обійти за допомогою функцій оболонки. Дивіться мій відповідь на чи є спосіб для виходу «менше» Режим проходження без зупинки інших процесів в трубі? питання для деталей.

Для довідки, проблема з F, яка не працює з трубами, має список номерів 300 у списку відомих помилок і має назву Команда F не працює на трубопроводі.


Пов’язане зауваження стосується G (переходити до кінця): якщо трубопровід безпосередньо в менший, він не працюватиме.

Він працює з версії 466. Посилаючись на нотатки до випуску для цієї версії:

Нова команда ESC-G переходить до кінця буферних даних у трубі


Команда ESC-G була представлена ​​у версії 466, випущена 23 серпня 2014 р.
мик

@mik Схоже, помилка у примітках до випуску для версії 471. Спасибі, виправлено.
Пьотр Доброгост

Це не помилка, вони просто перераховують зміни поступово після стабільного випуску, версія 458 в цьому випадку. Однак не існує стабільного випуску з командою ESC-G.
мик

Команда ESC-G тепер знаходиться у стабільному випуску (481): "16 жовтня 2015 року менше-481 було випущено для загального використання".
Мік

Оновлення: Що стосується команди F на трубах, це також фіксується в меншій-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.)

тож це має працювати, і це фактично працює для мене.


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