BASH Programming - Введение

       

Обработка типов данных


Обычно PDQ определяет тип входных данных с помощью команды file(1). Для каждого типа, возвращенного командой file, и который вы хотите обрабатывать, вам необходимо определить предложение language_driver. Это предложение состоит в основном из скрипта для обработки задания печати, на любом (!) языке скриптов, который вы захотите использовать (языком по умолчанию является язык Bourne shell).

В нашем случае мы хотим печатать Postscript и ASCII на нашем принтере BJC-210. Поэтому нам необходимо два драйвера для типов файлов: один для запуска Ghostscript для заданий в формате Postscript, и один для добавления команд возврата каретки к заданиям в ASCII:

# Первый language_driver в этом файле, который соответствует результату # выполнения file(1) сообщает, что будет использовано language_driver ps { # file(1) возвращает строку "PostScript document text conforming at..." filetype_regx = "postscript" convert_exec = { gs -sDEVICE=$MODE -r360x360 \ # ключи gs из базы данных -q -dNOPAUSE -dBATCH -dSAFER \ # "обычные" ключи Ghostscript -sOutputFile=$OUTPUT $INPUT # обработка INPUT в файл OUTPUT

# Последние две строки часто одинаковы для всех поддерживаемых gs # принтеров. Однако строка gs..., будет разная для каждого из # принтеров. } }

# Мы объявили тип text после postscript, потому-что команда "file" часто # описывает файл postscript как текстовый (чем он и является). language_driver text { # Нет filetype_regx; мы ищем соответствие имени драйвера: "text" convert_exec = {#!/usr/bin/perl # Программа на Perl, просто потому-что мы можем писать на нем! my ($in, $out) = ($ENV{'INPUT'}, $ENV{'OUTPUT'}); open INPUT, "$in"; open OUTPUT, ">$out"; while(<INPUT>) { chomp; print OUTPUT, "$_\r\n"; } } }

Это все! В то время как другие принтера нуждаются в фильтрации выходных данных (как описано в следующем разделе), вышеприведенное предложение подходит для BJC-210. Мы просто передадим их указанному предложению driver:


driver canon-bjc210-0.1 { option { var = "MODE" desc = "Print Mode" # default_choice "Color" # раскомментируйте для установки значения по # умолчанию choice "BW" { # Часть value назначает переменной MODE все что вы захотите. # Мы будем назначать текст, который отличается для разных наборов # ключей Ghostscript для каждого из режимов value = "bj200" help = "Fast black printing with the black cartridge." desc = "Black-only" } choice "Color" { value = "bjc600" help = "Full-color printing." desc = "Color" } }

# Первый language_driver в этом файле, который соответствует результату # выполнения file(1) сообщает, что будет использовано language_driver ps { # file(1) возвращает строку "PostScript document text conforming at..." filetype_regx = "postscript" convert_exec = { gs -sDEVICE=$MODE -r360x360 \ # gs options from the database -q -dNOPAUSE -dBATCH -dSAFER \ # the "usual" Ghostscript options -sOutputFile=$OUTPUT $INPUT # process INPUT into file OUTPUT

# Последние две строки часто одинаковы для всех поддерживаемых gs # принтеров. Однако строка gs..., будет разная для каждого из # принтеров. } }

# Мы объявили тип text после postscript, потому-что команда "file" часто # описывает файл postscript как текстовый (чем он и является). language_driver text { # Нет filetype_regx; мы ищем соответствие имени драйвера: "text" convert_exec = {#!/usr/bin/perl # Программа на Perl, просто потому-что мы можем писать на нем! my ($in, $out) = ($ENV{'INPUT'}, $ENV{'OUTPUT'}); open INPUT, "$in"; open OUTPUT, ">$out"; while(<INPUT>) { chomp; print OUTPUT, "$_\r\n"; } } } }

Если вы хотите добавит что-нибудь в начало или конец всех заданий печати, или выполнить какое-нибудь преобразование любых данных любых типов, то воспользуйтесь предложением filter_exec. Наш принтер Canon не нуждается в таком предложении, но просто для примера, мы приведем простую иллюстрацию, показывающую как сделать поддержку двухсторонней печати и выбора разрешения на принтерах Laserjet или других моделях, поддерживающих PJL:



driver generic-ljet4-with-duplex-0.1 { # Сначала два предложения option для обеспечения выбора пользователя: option { var = "DUPLEX_MODE" desc = "Duplex Mode" default_choice = "SIMPLEX" choice "SIMPLEX" { value = "OFF" desc = "Односторонняя печать" } choice "DUPLEX" { value = "ON" desc = "Двухсторонняя печать" } }

option { var = "GS_RES" desc = "Resolution" default_choice = "DPI600" choice "DPI300" { value = "-r300x300" desc = "300 dpi" } choice "DPI600" { value = "-r600x600" desc = "600 dpi" } }

# Теперь мы обрабатываем Postscript используя драйвер Ghostscript для ljet4: language_driver ps { filetype_regx = "postscript" convert_exec = { gs -sDEVICE=ljet4 $GS_RES \ -q -dNOPAUSE -dBATCH -dSAFER \ -sOutputFile=$OUTPUT $INPUT } }

# В заключение мы обернем задание в команды PJL: filter_exec { # требуется наличие команды echo с возможностями выдачи кода escape... echo -ne '\33%-12345X' > $OUTPUT

echo "@PJL SET DUPLEX=$DUPLEX_MODE" >> $OUTPUT # Вы можете вставить дополнительные команды @PJL, подобные приведенным выше. # Убедитесь, что вы всегда дополняете (>>) к выходному файлу!

cat $INPUT >> $OUTPUT echo -ne '\33%-12345X' >> $OUTPUT } }


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