2 FreeBSD handbook中文版 11 打印 高级打印机设置 A.过滤器( 六 )


#!/bin/sh
#
# pstf - Convert groff"s troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps “$@”
上面的script 再一次使用lprps 与打印机沟通 。如果我们的打印机接在并口上,那么
我们可以用下面这个script 取代上面的script:
#!/bin/sh
#
# pstf - Convert groff"s troff data into PS, then print.
# Installed in /usr/local/libexec/pstf
#
exec grops
而如果要使这个过滤程序,我们在/etc/printcap 里的设置:
第33 页FreeBSD 使用手册
:tf=/usr/local/libexec/pstf:
这里有一个让熟悉FORTRAN 的老手惭愧的例子 。这是一个让所有可以打印纯文本的打印
机打出FORTRAN-text 的过滤程序 。我们将在teak 这台打印机上安装:
#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#
printf “33&k2G” && fpr && printf “33&l0H” && exit 0
exit 2
我们只要将这个过滤程序在/etc/printcap 文件里指定给teak 这台打印机即可:
:rf=/usr/local/libexec/hprf:
最后一个有点复杂的例子 。我们要为先前提到的teak 这台打印机新增一个可以将DVI
转成激光打印机能处理的格式 。首先,先修改/etc/printcap 文件中关于DVI 过滤程序的位
置:
:df=/usr/local/libexec/hpdf:
然后,我们要做出这个过滤程序 。我们需要一个能将DVI 转成激光打印机PCL 格式的程
序 。FreeBSD port 里(请参考The Ports Collection 这一节)有一个:dvi2xx 是这个程序的
名称 。安装这个程序能提供我们dvilj2p 这个能将DVI 转成LaserJet IIp、LaserJet III
以及LaserJet 2000 兼容的格式 。
dvilj2p 这个程序使得hpdf 这个过滤程序变得十分的复杂,因为dvilj2p 无法从标准
输入取得资料 。它得从文件中读资料 。最糟糕的是,这个文件还必需以.dvi 结尾,所以用
/dev/fd/0 作为标准输入是不行的 。我们可以用symblic link 产生一个暂时的文件名
(以.dvi 结尾)指向/dev/fd/0,然后强迫dvilj2p 从标准输入读取资料 。
第34 页FreeBSD 使用手册
另一个问题就是我们无法用/tmp 来存放我们暂时的连接 。Symbolic links 的使用者及
群组为bin 。而过滤程序是以使用者daemon 的身份在执行 。又/tmp 目录设置了sticky bit 。
因此虽然过滤程序建立了连接,但是因为这个连接属于其它的使用者而无法删除 。
因此,过滤程序将会把symbolic link 建立在目前的目录下,也就是spooling 目录(由
/etc/printcap 文件中的sd 关键词所指定) 。这是让过滤程序来做这件事最好的地方,因为
(通常)这里的可用空间会比/tmp 下来得多 。
所以,这个过滤程序应该要这么写:
#!/bin/sh
#
# hpdf - Print DVI data on HP/PCL printer
# Installed in /usr/local/libexec/hpdf
PATH=/usr/local/bin:$PATH; export PATH
#
# Define a function to clean up our temporary files. These exist
# in the current Directory, which will be the spooling directory
# for the printer.
#
cleanup() {
rm -f hpdf$$.dvi
}
#
# Define a function to handle fatal errors: print the given message
# and exit 2. Exiting with 2 tells LPD to do not try to reprint the
# job.
#
第35 页FreeBSD 使用手册
fatal() {
echo “$@” 1>&2
cleanup
exit 2
}
#
# If user removes the job, LPD will send SIGINT, so trap SIGINT
# (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15
#
# Make sure we are not colliding with any existing files.
#
cleanup
#
# Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal “Cannot symlink /dev/fd/0”
#
# Make LF = CR LF
#
printf “33&k2G” || fatal “Cannot initialize printer”

推荐阅读