Как использовать `cat` или` less` в зависимости от количества строк?

12

При просмотре содержимого файлов я хотел бы автоматически catсокращать файлы, кроме lessтех, которые превышают размер экрана. Я мог бы использовать что-то с wc -l, но есть ли лучший способ, который, возможно, также учитывает размер окна / текущее количество доступных строк?

Тобиас Кинцлер
источник
1
Хотя многие инструменты делают это, обратите внимание, что это нарушает ожидания. Т.е. пользователь не может заранее знать, что произойдет. Я нахожу это раздражающим, например, в git logкотором делает именно эту вещь. Вы никогда не знаете заранее, что вы получите (вы должны ударить q?).
битовая маска
4
ПРИМЕЧАНИЕ. В целом, вам следует избегать использования catфайлов для просмотра. Как правило, вы должны использовать только catдля отправки содержимого файла на стандартный вывод, чтобы он мог быть передан другому процессу. Причина, по которой следует избегать использования catдля просмотра, заключается в том, что он отправляет необработанные байты на терминал, что может привести к неожиданному выполнению команд терминала (например, некоторые пользователи застряли, когда файл содержит правильные байты для отключения клавиатуры терминала). , Обычно вы должны использовать пейджер lessили редактор, который будет форматировать специальные символы для отображения, чтобы они не интерпретировались терминалом.
Крис Пейдж
2
Если вы собираетесь использовать cat для просмотра содержимого файла непосредственно в терминале, хотя бы используйте cat -vего, чтобы он не содержал специальных символов.
Крис Пейдж
@bitmask Хороший вопрос, поэтому я спросил, возможно ли разделение экрана cat? что может быть лучшим решением
Тобиас Кинцлер
@ChrisPage Моя клавиатура не была убита, но я думаю , что мне удалось ввернуть кодовые один раз ... Спасибо за указание cat -vиз
Tobias Kienzler

Ответы:

9

Чтобы дать вам формулу, которая включает wcпроверку на основе:

(($(wc -l<input_file)<=$(tput lines))) && echo 'will fit' || echo 'not enough'

Существует $LINESпеременная оболочки, которая также может быть использована:

(($(wc -l<input_file)<=LINES)) && echo 'will fit' || echo 'not enough'

Но $LINESобновляется только когда в командной строке. Чтобы понять, что я имею в виду, запустите это и измените размер окна терминала во время sleep:

( sleep 3; echo $LINES; tput lines )
manatwork
источник
Спасибо, это имеет то преимущество, что его можно настроить на использование lessуже, если, например, 2/3 экрана были использованы cat.
Тобиас Кинцлер
20

Может быть, опция 'less -F file_to_read': меньше, если окно достаточно для отображения всего файла, и ждать на пейджере, если это не так

Дом
источник
звучит хорошо, но это ничего не выводит в этом случае, и коды выхода одинаковы в обоих случаях
Тобиас Кинцлер
Я просто пытаюсь 'less -F / etc / passwd', и файл отображается корректно (с пейджером или без него). Вы правы, код возврата равен 0 в обоих случаях.
Дом
11
Эта команда работает в соответствии с запросом, но с небольшим затруднением: она очищает экран после отображения файла. Добавление этой -Xопции остановит очистку, поэтому короткие файлы будут отображаться, как это catпроисходит. К сожалению с -Xэкрана не очистится ни после отображения длинных, прокручиваемых файлов.
manatwork
1
@ Manatwork это здорово, спасибо. Не очищать экран на самом деле нормально, потому что это то, что могло бы (не) случиться, если бы catего тоже
вызвали