меньше с функциональностью типа «обновить файл»

меньше с функциональностью типа «обновить файл»

Я хочу посмотреть файл, который перезаписывается каждые 5 минут с помощью less. Как мне заставить lessего следовать новому дескриптору файла вместо того, чтобы отображать старый? watch "cat file"не получится, потому что файл слишком длинный, чтобы поместиться в одно окно терминала.

решение1

Вы можете получить этот эффект, выполнив Fкоманду ( Shift+F) во время просмотра файла в less. Чтобы остановить отслеживание и вернуться к перелистыванию, нажмитеCtrl+C

Поскольку ваш файл меняется только каждые 5 минут, вы также можете использовать tail -fи указать более длительное время сна с -s(по умолчанию 1 секунда). Например,

tail -f -s 60 myfile

проверяет myfileналичие выходных данных каждые 60 секунд.

EDIT: Из-за вводящего в заблуждение вопроса ответ выше был неудовлетворительным. Вторая попытка следует:

Чтобы повторно открывать один и тот же файл lessкаждые 5 минут, попробуйте сделать следующее:

while true; do ( sh -c 'sleep 600 && kill $PPID' & less myfile ); done

Это породит подоболочку, которая фоновый процесс другой оболочки, проинструктированный завершить свой родительский процесс через 5 минут. Затем он открывает файл с помощью less. Когда фоновая команда оболочки завершает родительскую подоболочку, она завершает все ее дочерние процессы, включая команду "less". Затем цикл начинает процесс снова.

Единственный простой способ, который я знаю, это завершить работу терминала, в котором находится ваша оригинальная оболочка. Если это неприемлемо, вы можете использовать трюк с «killfile»:

touch killfile
while [ -f killfile]; do stuff; done

Чтобы прекратить делать это stuff, rmвыполните killfile в другой оболочке.

решение2

Нечто подобное можно сделать и в vim.

Запустить сеанс сервера vim:

vim -R --servername refresh_session

Затем в другой консоли отслеживайте обновления файла и укажите сеансу vim перезагрузить файл, как только он обновится:

inotifywait -e close_write -m your_log_file | while read filename events; do
    vim --servername refresh_session --remote $filename
done

Несколько подводных камней.

  • Конечно, это не сработает, если ваша версия vimне скомпилирована с этой clientserverфункцией.
  • inoifywaitперестанет работать, когда файл будет удален. Поэтому я надеюсь, что ваш файл будет перезаписан. Конечно, это тоже можно обойти.

А если вы хотите получить более lessудобный опыт, вы можете использовать lessмакросы для назначения lessсочетаний клавиш в vim.

/usr/share/vim/vim73/macros/less.sh --servername refresh_session

решение3

Вы можете попробовать эту команду: tail -f file

решение4

Я нашел старую, но очень хорошую программу типа "less" ("пейджер"). В ней есть команда "R", которая обновляет файл.

Это называется"лв", Вы можете установить его в Ubuntu с помощью:

sudo apt install lv

Однако, похоже, у него нет функции автоперезагрузки.

Связанный контент