BASH Programming - Введение

       

Традиционная настройка lpd


Традиционная настройка lpd заканчивается тем, что можно создавать очереди файлов и печатать их. Она не обращает никакого внимания на то понимает ли принтер эти файлы или нет, и скорее всего не позволит производить привлекательный вывод. Тем не менее, это первый шаг к пониманию, так что читайте!

Для добавления очереди печати к lpd, вы должны добавить запись в файл /etc/printcap, и создать новую буферную директорию в каталоге/var/spool/lpd.

Запись в файле /etc/printcap выглядит примерно так:

# ЛОКАЛЬНЫЙ djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :sh:

Это определяет принтер называемый lp, dj, или deskjet, его спул размещается в директории /var/spool/lpd/dj, без ограничения максимального размера задания, который печатает на устройство /dev/lp0, и который не имеет страницу с заголовком (с именем человека, который печатает и т.п. информацией) добавленную в начало задания печати.

Теперь прочитайте справочную страницу для

.

Вышеприведенный пример выглядит очень простым, но он имеет ловушку-- хотя я посылаю файлы, которые DeskJet 500 может понимать, этот DeskJet будет печатать странные вещи. Например посыл обычного текстового файла Unix приведет к тому, что deskjet будет интерпретировать символы новой строки как символы, и выдаст мне:

This is line one. This is line two. This is line three.

Печать файла PostScript на этот принтер выдаст великолепный листинг команд PostScript, напечатанных с этим "лестничным эффектом", а не полезный вывод.

Очевидно требуется что-то сделать, и это является назначением фильтрации. Более наблюдательные из тех кто читал справочную страницу printcap должны были заметить атрибуты принтера if и of. Хорошо, if, или входной фильтр -- это все что нам нужно здесь.

Если мы напишем маленький скрипт, названный filter, который добавляет возврат каретки до символа новой строки, то лестничный эффект будет ликвидирован. Так что мы добавим строку if в нашу, вышеприведенную запись в printcap:

lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :mx#0:\ :lp=/dev/lp0:\ :if=/var/spool/lpd/dj/filter:\ :sh:


Простой скрипт может выглядеть так:

#!perl # Предыдущая строка должна содержать полный путь к perl # Скрипт должен быть исполнимым: chmod 755 filter while(<STDIN>){chop $_; print "$_\r\n";}; # Вы можете также добавить в конец прогон страницы: print "\f";

Если мы сделаем как приведено выше, мы будем иметь принтер на котором мы сможем печатать обычные текстовые файлы Unix и получать осмысленные результаты. (Конечно мы можем написать этот фильтр четырьмя миллионами лучших способов, но этот более иллюстративный. Вы можете попытаться сделать это более эффективно).

Оставшаяся проблема в том что печать простого текста не является злободневной -- наверняка будет лучше если мы сможем печатать PostScript и другие типы форматированого и графического вывода. Да и это легко сделать. Метод является просто расширением вышеприведенного фильтра для исправления перевода строки. Если вы напишите фильтр, который может воспринимать произвольные типы файлов как ввод и производить вывод для DeskJet для каждого случая, тогда мы безусловно получим "умный" спулер принтера.

Такой фильтр называется magic-фильтр. Не беспокойте себя написанием фильтра, до тех пора пока они не будут печатать странные вещи -- в сети уже существует много хорошо написанных фильтров. APS Filter это лучший среди всех, или ваш дистрибутив Linux может иметь утилиту настройки принтера, которая сделает всю настройку очень простой.

Есть правда ловушка для таких фильтров: некоторые старые версии lpd не запускают фильтр if для удаленных принтеров, а некоторые запускают. Версии lpd используемые в современных дистрибутивах Linux и FreeBSD запускают указанный фильтр; большинство коммерческих юниксов до сих пор поставляются с lpd, которые не запускают фильтр для удаленных принтеров. Смотрите раздел о сетевой печати для более детальной информации.


Содержание раздела