Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

20080728

less: автоматический просмотр архивов *.gz и других типов файлов

Популярную листалку для командной строки less легко научить просматривать не только текстовые файлы, но и многие другие. Например, ей можно смотреть сжатые файлы или файлы PDF не задумываясь о вызове архиватора или нужного конвертера. Примерно так:
$ less /usr/share/doc/less/changelog.gz
Собственно, во многих дистрибутивах так уже настроено по умолчанию. В Debian эта возможность по умолчанию выключена. Чтобы она заработала нужно в ~/.bashrc (если пользуетесь bash) добавить eval $(lesspipe) или eval $(lessfile). Это установит переменные окружения LESSOPEN и LESSCLOSE, говорящие less пропускать файлы через указанный фильтр. Фильтр /usr/bin/lesspipe смотрит на расширение файла и запускает нужный конвертрер, если необходимо. Разница между lesspipe и lessfile в том, что первый конвертирует файлы на лету, сразу отдавая результат в less, а lessfile вначале полностью конвертирует файл, и только потом вызывает less.

Понятно, что очень просто можно настроить пользовательские фильтры. Добавлять их нужно в пользовательский скрипт ~/.lessfilter. Например, чтобы просматривать с помощью less файлы OpenOffice, я добавляю фильтр, вызывающий antiodt, а чтобы просматривать файлы MSWord, фильтр, вызывающий antiword. Файл ~/.lessfilter выглядит при этом так:
#!/bin/sh
(
case `echo "$1" | tr '[:upper:]' '[:lower:]'` in
    *.odt)
        if [ -x "`which antiodt`" ]; then antiodt "$1" ;
        else cat "$1"; fi ;; # No antiodt available
    *.doc)
        if [ -x "`which antiword`" ]; then antiword "$1" ;
        else cat "$1"; fi ;; # No antiword available
esac
) 2>/dev/null
P.S. Код раскрасил с помощью плагина toblog к vim, создающего цветной HTML согласно текущей цветовой схеме редактора.

6 коммент.:

  1. Есть такая вещь как lesskey, а в ней есть возможность определять LESSOPEN и LESSCLOSE на лету, то есть не записывая их в переменные окружения.
    То есть реальный пример:
    - создаем файл ~/.lesskey
    #env
    LESSOPEN = |lesspipe %s
    LESSCHARSET = koi8-r
    LESSCHARDEF = 8bcccbcc18b95.b128.
    LESSEDIT = %E ?lm+%lm. %f

    Потом запускаем команду lesskey
    после этого все работает

    На самом деле через lesskey можно много чего в less настроить :-)

    ОтветитьУдалить
  2. а не проще командой zless воспользоваться?

    ОтветитьУдалить
  3. 2chernomrdin:
    спасибо за подсказку, хотя по-моему для настройки LESSOPEN установка двух переменных окружения — прозрачнее

    2antivan:
    ну раньше и пользовался, пока не собрался man less прочитать :)

    с zless неудобство, что буква z вначале, а *.gz — в конце; т.е. набираю less bla-bla<TAB> и вижу, что файл *.gz, значит надо вернуться в начало строчки, чтобы добавить z (в screen ^A + a + z, три лишних нажатия)

    ОтветитьУдалить
  4. Пример файла ~/.lessfilter не совсем корректен. lessspipe определяет обработал ли пользовательский
    фильтр файл или нет по коду возврата. Поэтому на файлы тех форматов, что lessfilter не обрабатывет
    он должен возвращать ненулевой код возврата. В противном случае стандартные правила
    less-препроцессинга файлов (тот же *.gz) будут заслонены пользовательскими. То есть в конец case
    следует добавить:

    *)
    exit 1

    Из этого также следует, что громоздкие if-ы больше не нужны, — например, первая ветвь case
    переписывается так:

    [ -x "`which antiodt`" ] && antiodt "$1"

    (Остальные, естественно, аналогично.)

    ОтветитьУдалить
  5. 2 Igor

    Спасибо, перечитал man lesspipe. Согласен. Заметку поправлю.

    ОтветитьУдалить
  6. Присмотревшись, я понял, что, более того, проверка
    [ -x "`which <нужная программа>`" ]
    тоже не нужна: если нужная программа не будет найдена shell, скрипт lessfilter и так завершится с ненулевым кодом возврата. Всё сказанное делает lessfilter на удивленее компактнее и элегантнее! ;)

    ОтветитьУдалить