【求助】SCO505下打印机走纸的问题

发表于:2007-05-26来源:作者:点击数: 标签:
Epson1600K3打印机打印报表,打印完一张纸后自动走一张纸,哪位大侠能给一个详细的解决方法? 多谢! 黑骏马 回复于:2004-07-21 17:39:39 ^L换页符 cool008 回复于:2004-07-25 14:45:40 [quote:7795803ea7="黑骏马"]^L换页符[/quote:7795803ea7] 老兄:什

Epson 1600K3打印机打印报表,打印完一张纸后自动走一张纸,哪位大侠能给一个详细的解决方法?
多谢!

 黑骏马 回复于:2004-07-21 17:39:39
^L换页符

 cool008 回复于:2004-07-25 14:45:40
[quote:7795803ea7="黑骏马"]^L换页符[/quote:7795803ea7]
老兄:什么意思?不明白???

 wenyue 回复于:2004-07-25 21:02:25
需要在一个配置文件中去掉换行符。

但我记不清楚是哪个文件了。明天翻翻笔记再告诉你。

 纳兰婷 回复于:2004-07-25 21:10:23
在超级用用户下#MKDEV LP 把那个默认的BANNER值改掉就好了

 cool008 回复于:2004-07-28 22:31:08
BANNER设置为等于No?不是的,走纸的那张上面没有打印出banner,
哪位给讲解一下如何去掉换行苻???
多谢多谢!!!

 melove 回复于:2004-07-28 23:02:15
这是最直接,最彻底,最有效的办法!包你满意。

假设的系统打印机名为: lq1600
那么在系统中就存在这样一个文件,它是你的打印过滤shell

/usr/spool/lp/admins/lp/interfaces/lq1600

用vi编辑它。
找到这样一行
if [ "$banner" = yes ]
then
             while    [  "$nhead" -gt   0 ]
             do
                     ...
                     ...
                     ...
                     echo "\f\c"
                     nhead=`expr $nhead - 1`
            done
fi

请把文件中我用省略号标示的部分在前面加#注释掉!!

可以了吧。回贴吧兄弟。

 melove 回复于:2004-07-28 23:05:26
连 echo "\f\c"也注释掉。 补充一下,不好意思。

 wenyue 回复于:2004-07-29 09:08:23
melove 兄的方法是对的。

我将/var/spool/lp/admins/lp/interfaces/printer文件第155行 
echo "\f\c"  前加#注释掉就可以去掉换行。

 cool008 回复于:2004-07-30 00:58:57
多谢各位老兄解惑!多谢多谢!!!

 nongdi 回复于:2004-09-29 10:24:53
老问题,重新提。
我的/var/spool/lp/admins/lp/interfaces/printer文件有1026行, echo "${CR}\c"为这个,没有#,OS为5.06。
打印的时候:1。字体太宽;2.走纸时想让它打到那里就在那里停住。
这里怎么设置?

 nongdi 回复于:2004-09-29 10:28:15
文件内容:
:
# @(#) standard 69.1 98/03/16 
#
# Copyright (C) 1988-1998 The Santa Cruz Operation, Inc.
# All Rights Reserved.
# The information in this file is provided for the exclusive use of
# the licensees of The Santa Cruz Operation, Inc.  Such users have the
# right to use, modify, and incorporate this code into other products
# for purposes authorized by the license agreement provided they include
# this notice and the associated copyright notice with any such product.
# The information in this file is provided "AS IS" without warranty.
#
###########
##
## Standard printer interface program.
##
###########
#

#####
#
# Until we get to the point below where the printer port
# and physical printer are initialized, we can't do much
# except exit if the Spooler/Scheduler cancels us.
#####
trap 'exit' 15

#####
#
# We can be clever about getting a hangup or interrupt, though, at least
# until the filter runs. Do this early, even though $LPTELL
# isn't defined, so that we're covered.
#####
catch_hangup () {
if [ -n "${LPTELL}" ]
then
echo \
"The connection to the printer dropped; perhaps the printer went off-line?" \
| ${LPTELL} ${printer}
fi
return 0
}
catch_interrupt () {
if [ -n "${LPTELL}" ]
then
echo \
"Received an interrupt from the printer.  The reason is unknown,
although a common cause is that the baud rate is too high." \
| ${LPTELL} ${printer}
fi
return 0
}
trap&np'''catch_hangup; exit_code=129 exit 2''' 1
trap&np'''catch_interrupt; exit_code=129 exit 2''' 2 3

#####
#
# Most of the time we o'''t want the standard error to be captured
# by the Spooler, mainly to avoid "Terminated" messages that the
# shell puts out when we get a SIGTERM.&nbsW'''ll save the standard
# error channel under another number, so we can use it when it
# should be captured.
#####
exec 5>&2 2>/dev/null

#####
#
# Set some globally used variables and functions.
#####

: ${TMPDIR:=/tmp}
: ${SPOOLDIR:=/usr/spool/lp}
: ${TERMINFO:=/usr/lib/terminfo}
: ${CHARSETDIR:=/usr/lib/charsets}

: ${LOCALPATH:=${SPOOLDIR}/bin}
PATH="/bin:/usr/bin:${LOCALPATH}"

MAX_COLS_SMALL_BANNER=40

#####
# Use ${TMPPREFIX} as the prefix for all temporary files, so
# that cleanup is easy. The prefix may be up to 13 characters
# long, so you only have space for one more character to make
# a file name. If necessary, make a directory using this prefix
# for better management of unique temporary file names.
#####
TMPPREFIX=${TMPDIR}/`uname -n`$$

#####
# Before exiting, set ${exit_code} to the value with which to exit.
# Otherwise, the exit from this script will be 0.
#####
trap&np'''rm -fr ${TMPPREFIX}?; exit ${exit_ce''' 0

#####
# ${LPTELL} is the name of a program that will send its
# standard input to the Spooler. It is used to forward
# the description of a printer fault to the Spooler,
# which uses it in an alert to the administrator.
#####
if [ ! -x "${LPTELL:=${LOCALPATH}/lp.tell}" ]
then
fake_lptell () {
header="no"
while read line
do
if [ "no" = "${header}" ]
then
errmsg ERROR ${E_IP_UNKNOWN} \
"unknown printer/interface failure" \
"consult your system administrator;
reasons for failure (if any) follow:"
header=yes
fi
echo "${line}" >&2
done
return 1
}
LPTELL=fake_lptell
fi

#####
# ${DRAIN} is the name of a program that will wait
# long enough for data sent to the printer to print.
#####
if [ -x "${LOCALPATH}/drain.output" ]
then
DRAIN="${LOCALPATH}/drain.output 5" # wait only five seconds
else
DRAIN=
fi

#####
# ${LPCAT} is the name of a program to use as a default
# filter. Minimally it should copy its standard input to
# the standard output, but it should also trap printer
# faults. The current LPCAT traps hangups (DCD dropping, SIGHUP),
# interrupts (SIGINT, SIGQUIT), broken pipe (SIGPIPE), and
# excess delays in sending data to the printer, interpreting all
# as printer faults.
#####
if [ ! -x "${LPCAT:=${LOCALPATH}/lp.cat}" ]
then
LPCAT="cat"
fi

#####
# ${LPSET} is the name of a program that will set the
# character pitch, line pitch, page width, page length,
# and character set. It helps to have this in a single
# binary program so that (1)&npi''''s faster than calls
# to "tput"; and (2) it can aclearcase/" target="_blank" >ccess the new Terminfo
# capabilities for printers (on pre SVR3.2 machines, tput&nb;a''''t).
#####
if [ ! -x "${LPSET:=${LOCALPATH}/lp.set}" ]
then
fake_lpset () {
echo H V W L S >&2
false
}
LPSET=fake_lpset
fi

#####
# ${TPUT} is "tput" IFF it works.&npW''''ll disable it if we get an
# ugly error message the first time we use it. See the TERM variable
# later in the script.
#
# NOTE: The check we use to see if "tput" works is to use an OLD
# Terminfo capability, like "lines". If it works with that it may
# still fail with some of the newer capabilities like "init" (SVR3.0)
# or "swidm" (SVR3.2), because the version of "tput" we have on your
# machine is older. Thus, on some of the code where ${TPUT} is used
#&nb;o''''ll see "2>/dev/null" being used to avoid ugly error messages.
#####
TPUT=tput

#####
#
# ${LPPAGER} is the name of a filter that will pad its input at
# the tail to make it exactly fit the last page. This is only
# used for simple printers that&nb;o''''t have a formfeed. (Unfortunately,
# the "pr" command&nb;o''''t work.) ${LPPAGER} takes one argument, the
# page length (in lines).
#
# NOTE: This program must trap SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGTERM.
# The first four can occur with various real and imaginary printers.
# The last occurs when we are terminated (disable, cancel). On SIGTERM
# the ${LPPAGER} program must finish a full page before exiting!
#####
if [ ! -x "${LPPAGER:=${LOCALPATH}/lp.page}" ]
then
LPPAGER=
fi

#####
# Error message formatter:
#
# Invoke as
#
# errmsg severity message-number problem help
#
# where severity is "ERROR" or "WARNING", message-number is
# a unique identifier, problem is a short description of the
# problem, and help is a short suggestion for fixing the problem.
#####

LP_ERR_LABEL="UX:lp"

E_IP_ARGS=1
E_IP_OPTS=2
#E_IP_FILTER=3
E_IP_STTY=4
E_IP_UNKNOWN=5
E_IP_BADFILE=6
E_IP_BADCHARSET=7
E_IP_BADCPI=8
E_IP_BADLPI=9
E_IP_BADWIDTH=10
E_IP_BADLENGTH=11
E_IP_ERRORS=12 # (in slow.filter)

errmsg () {
case $1 in
ERROR )
sev="  ERROR";
;;
WARNING )
sev="WARNING";
;;
esac
# tag=`expr "${LP_ERR_LABEL}" : "\(.*\):"``expr "${LP_ERR_LABEL}" : ".*:\(.*\)"`
echo "${LP_ERR_LABEL}: ${sev}: $3
        TO FIX: $4" >&5
}


###########
##
## Check arguments
###########

parse () {
echo "`expr \"$1\" : \"^[^=]*=\(.*\)\"`"
}

#####
#
# This program is invoked as
#
# ${SPOOLDIR}/.../printer request-id user title copies options files...
#
# The first three arguments are simply reprinted on the banner page,
# the fourth (copies) is used to control the number of copies to print,
# the fifth (options) is a blank separated list (in a single argument)
# of user or Spooler supplied options (without the -o prefix),
# and the last arguments are the files to print.
#####

if [ $# -lt 6 ]
then
errmsg ERROR ${E_IP_ARGS} \
"wrong number of arguments to interface program" \
"consult your system administrator"
exit_code=1
exit 0
fi

printer=`basename $0`
request_id=$1
user_name=$2
title=$3
copies=$4
option_list=$5

shift 5
files="$*"
nfiles=$#

if [ -z "${BANNERS}" ]
then
nhead=1
else
nhead=${BANNERS}
fi

nobanner="no"
nofilebreak="no"
stty=

inlist=
for i in ${option_list}
do
case "${i}" in

nobanner )
nobanner="yes"
;;

nofilebreak )
nofilebreak="yes"
;;

cpi=pica )
cpi=10
;;
cpi=elite )
cpi=12
;;
cpi=* )
cpi=`parse ${i}`
;;

lpi=* )
lpi=`parse ${i}`
;;

length=* )
length=`parse ${i}`
;;

width=* )
width=`parse ${i}`
;;
#####
#
# If you want to add options that, like "stty",
# take a list (e.g.&npfo''''a ns;''''), identify
# them here and below.
#####
inlist=`expr "${i}" : "^\([^=]*\)="`
case "${i}" in
${ns='''*'''' )
list=`expr "${i}" : [=]*=''\.\''''"`
case "${inlist}" in
stty )
stty="${stty} ${list}"
;;
# foo )
# foo="${foo} ${list}"
# ;;
esac
inlist=
;;
* )
list=`expr "${i}" : [=*''''\(.*\)"`
;;
esac
;;

stty=* )
stty="${stty} `parse ${i}`"
;;

# foo=* )
# foo="${foo} `parse ${i}`"
# ;;b>*'''' )
list="${list} "`expr "${i}" : \.\''''\$"`
case "${inlist}" in
stty )
stty="${stty} ${list}"
;;
# foo )
# foo="${foo} ${list}"
# ;;
esac
;;

#####
#
# If you want to add simple options (e.g. bar=a, e.g. stuff)
# identify them here.
#####
# bar=* )
# bar=`parse ${i}`
# ;;
# stuff )
# stuff="yes"
# ;;

* )
if [ -n "${inlist}" ]
then
list="${list} ${i}"
else
errmsg WARNING ${E_IP_OPTS} \
"unrecognized \"-o ${i}\" option" \
"check the option, resubmit if necessary
printing continues"
fi
;;
esac
done

#####
#
# Additional `pmtr''''''' are passed via Shell environment
# variables:
#
# TERM The printer type (used for Terminfo access)
# CHARSET The character set to choose
# FILTER The filter to run
#####

#####
# Set defaults for unset variables.
#####

: ${TERM:=unknown}
tput lines 1>/dev/null 2>&1 || TPUT=:

: ${CHARSET:=cs0}

if [ -z "${FILTER}" ]
then
#####
#
# If no filter is being used, we have a little routine that
# will push the data to the printer. It traps hangups (loss
# of carrier) and checks for excessive delays in sending the
# data to the printer. The lesser of the print rate of the printer
# (obtained from Terminfo) or the baud rate is used to compute
# the expected delay. If neither of these is correct, you
# may be experiencing false alarms. If so, give the correct
# rate, in characters per second, as a single argument.
# An argument of 0 meanns;on''''t check for delays.
# Give an -r option to get a printout of actual delays.
# (QUOTES ARE IMPORTANT!)
#####
# FILTER="${LPCAT} 120" # e.g. 120 CPS
FILTER="${LPCAT} 0" # allow infinite delays
# FILTER="${LPCAT} -r 0 2>/tmp/delays" # check actual delays
# FILTER=${LPCAT}
fi


###########
##
## Initialize the printer port
###########

#####
#
# SERIAL PORTS:
# Initialize everything.
#
# PARALLEL PORTS:
ns;on''''t initialize baud rate.
# # However, by splitting the initialization into two steps and letting
# the serial-only part fail nicel&bpit''''ll work.
#
# Another point: The output must be an;`t''''''' device. If notns;on''''t
# bother with any of this.
#####
stty1= stty2=
tty 0<&1 1>/dev/null 2>&1 && {

#####
#
# First set the default parameters,
# then the requested parameters.
#####

stty \
9600 \
0<&1 2>/dev/null 1>&2
stty \
cs8 -cstopb -parenb -parodd \
ixon -ixany \
opost -olcuc onlcr -ocrnl -onocr -onlret -ofill \
nl0 cr0 tab0 bs0 vt0 ff0 \
0<&1 2>/dev/null 1>&2

if [ -n "${stty}" ]
then
if stty ${stty} 0<&1 1>/dev/null 2>&5
then
:
else
errmsg ERROR ${E_IP_STTY} \
"stty option list failed" \
"check the \"-o stty\" option you used,
or consult your system administrator"
exit_code=1
exit 0
fi
fi

#####
#
# Here you may want to add other port initialization code.
# Some examples:
#
# estty # for printer needing hardware flow control (3B2/EPORTS)
# fctty # for printer needing hardware flow control (3B15,3B20)
#####
#estty 0<&1
#fctty 0<&1


##########
#
# Find out if we have to turn off opost before initializing the
# printer and on after. Likewise, check clocal.
#
# Turning OFF opost (output postprocessing) keeps the UNIX system
# from changing what we try to send to the printer. Turning ON
# clocal keeps the UNIX system from dropping what we are trying to
# send if the printer drops DTR. An example of the former is the
# AT&T 479, which wants to send a linefeed (ASCII 10) when a page
# width of 10 is set; with opost on, this COULD BE turned into a
# carriage-return/linefeed pair. An example of the latter is the
# AT&T 455, which momentarily drops DTR when it gets the
# initialization string, is2; with clocal off, the UNIX system
# stops sending the rest of the initialization sequence at that
# point.
#
# THIS CODE MUST FOLLOW THE REST OF THE PORT INITIALIZATION CODE.
##########
exec 3>&1
cur_stty=`stty -a 0<&3`
exec 3>&-
expr "${cursy"nbsp:&nbs;'''.*-opost'''' 1>/dev/null 2>&1 \
|| stty1="${stty1} -opost" stty2="${stty2} opost"
expr "${cu_t} :&nbs;'''.*-clocal'''' 1>/dev/null 2>&1 \
&& stty1="${stty1} clocal" stty2="${stty2} -clocal"

}


###########
##
## Initialize the physical printer (Part I).
## Here we bring the printer to a sane state.
###########

##########
#
# WARNING! The "echo" command will catch backslashes (\) and
# try to interpret the characters following it. Thus, using
# "echo" to print string values obtained from "tput" is dangerous.
##########
# We''''re confident that most&nppiters don''''t have backslashes
# in the control sequences for carriage return and forfe.
# We''''re also confident thans;hese don''''t contain neie.
# We''''re also confident that most printers have a linefeed
# in the control sequence for doing a newline (move to beginning
# of next line), u&bp;we can''''t capture it like we do the
# carriage return or form-feed. Thus we set it unconditionally. <>&bp;We don''''t set form-feed&nbsi&bp;it isn''''t defined, however, because
# maybe the&nb;rner doesn''''t have a formfeed. If tns;set, we''''ll
# have to pass the banner page(s) through the LPPAGER program
# to make sure they end at a page break.
#####

CR=`${TPUT} cr`
[ -z "${CR}" ] && CR="\r"

FF=`${TPUT} ff`

NL="${CR}\n"

lines=`${TPUT} lines`
[ -z "${lines}" -o 0 -ge "${lines}" ] && lines=66

cols=`${TPUT} cols`
[ -z "${cols}" -o 0 -ge "${cols}" ] && cols=132

#####
#
# Basic initialization&pTens;`else'''''''' clause is equivalent,
# but covers cases where old Terminal Information Utilities are present.
#####
[ -n "${stty1}" ] && stty ${stty1} 0<&1
if ${TPUT} init 2>/dev/null
then
:
else
pgm=`${TPUT} iprog`
if [ -x "${pgm}" ]
then
eval ${pgm}
fi

${TPUT} is1
${TPUT} is2

tabset=
if [ "8" != "`${TPUT} it`" ]
then
stty tab3 0<&1 1>/dev/null 2>&1

elif `${TPUT} ht >/dev/null`
then
tabset="/usr/lib/tabset/${TERM}"
if [ -r ${tabset} ]
then
cat -s ${tabset}
fi
stty tab3 0<&1 1>/dev/null 2>&1
fi

file=`${TPUT} if`
if [ "${tabset}" != "${file}" -a -r "${file}" ]
then
cat -s "${file}"
fi

${TPUT} is3
echo "${CR}\c"
fi
[ -n "${stty2}" ] && stty ${stty2} 0<&1

#####
#
# The banner page (and cancellation page) will
# use double width charactsns;if they''''re available.
#####
WIDE_CS=`${TPUT} swidm 2>/dev/null` && NORM_CS=`${TPUT} rwidm 2>/dev/null`
PAD="#####${NL}"

#####
#
# Now that the printer is ready for&nppiting, we''''re able
# to record on paper a cancellation.
#####

cancel_banner () {
echo "${PAD}${PAD}\c"
echo "#####${WIDE_CS} Job ${request_id}${NORM_CS}${NL}\c"
echo "#####${WIDE_CS} suspended or canceled${NORM_CS}${NL}\c"
echo "${PAD}${PAD}\c"
}

canceled () {
${TPUT} scs 0 2>/dev/null
echo "${CR}\c"
if [ "${width:-${cols}}" -lt "${MAX_COLS_SMALL_BANNER}" ]
then
WIDE_CS= NORM_CS=
fi
if [ -z "${FF}" ]
then
cancel_banner | ${LPPAGER} ${length}
else
cancel_banner; echo "${CR}${FF}\c"
fi
trap ''''canceled; i_oe=0 exit'''' 15


###########
##
## Print the banner page
###########

#####
#
# You may want to change the following code to get a custom banner.
#####

regular_banner () {
echo "${CR}\c"
echo "${PAD}${PAD}${PAD}${PAD}${PAD}\c"
echo "#####${WIDE_CS}       User: ${user_name}${NORM_CS}${NL}\c"
if [ -n "${title}" ]
then
echo "${PAD}\c"
echo "#####${WIDE_CS}      Title: ${title}${NORM_CS}${NL}\c"
fi
echo "${PAD}\c"
echo "#####${WIDE_CS}    Prind&bp;`date ''''+%a %H:%M&nbs%&bp;%d, %Y''''`${NORM_CS}${NL}\c"
echo "${PAD}\c"
echo "#####${WIDE_CS} Job number: ${request_id}${NORM_CS}${NL}\c"
echo "${PAD}${PAD}${PAD}${PAD}${PAD}\c"
}

small_banner () {
echo "${CR}\c"
echo "${PAD}\c"
echo "#####  User: ${user_name}${NL}\c"
if [ -n "${title}" ]
then
echo "##### Title: ${title}${NL}\c"
fi
echo "#####  De&bp;`date ''''+%a %H:%M&nbs%&bp;%d, %Y''''`${NL}\c"
echo "#####   Job: ${request_id}${NL}\c"
echo "${PAD}\c"
}

if [ "no" = "${nobanner}" ]
then
if [ "${width:-${cols}}" -lt "${MAX_COLS_SMALL_BANNER}" ]
then
ban=small_banner
else
ban=regular_banner
fi

# Added for XENIX compatability with /etc/default/lpd

while [ $nhead -gt 0 ]
do

if [ -z "${FF}" ]
then
${ban} | ${LPPAGER} ${length}
else
${ban}; echo "${CR}${FF}\c"
fi
nhead=`expr $nhead - 1`
done
fi


###########
##
## Initialize the physical printer (Part II)
## Here we select the character and line pitches, page size,
## and character pitch. One could argue that this should be
## done before the banner is printed, so that the banner fits
## on a preprinted fm&bp;We don''''t, to keep the banner page
## looking consistent for the operator.
## You can move this code before the banner code if you disagree.
###########

#####
#
# The funny business with the "exec" and "2>&1". is to let us capture
# the standard ERROR, not the standard OUTPUT as is the usual case
# with foo=`cmd`. We duplicate the standard output (i.e the
# channel to the printer) as channel 3, then do the foo=`cmd`.
# Inside the `cmd` we redirect the standard error to the same
# place as the standard output (now being captured), then redirect
# the standard output to the same place as channel 3 (the printer,
# where we want it).
#####
[ -n "${stty1}" ] && stty ${stty1} 0<&1
exec 3>&1
chk=`${LPSET} "${cpi}" "${lpi}" "${width}" "${length}" "${CHARSET}" 2>&1 1>&3`
exec 3>&-
[ -n "${stty2}" ] && stty ${stty2} 0<&1

#####
#
# The standard error of the delivered ${LPSET} program
# is a string of letters, H, V, W, L, S, which correspond
# to cpi, lpi, width, length, and character set. A letter
# is present only if the corresponding attribute could not
# be set.
#####
for err in ${chk}
do
case ${err} in
H )
errmsg WARNING ${E_IP_BADC}ns;\
"can''''t select the character pitch \"${cpi}\"" \
"check the valid pitches for the printer,
or consult your system administrator;
printing continues"
;;
V )
errmsg WARNING ${E_IP_BAP}nsp;\
"can''''t select the line pitch \"${lpi}\"" \
"check the valid pitches for the printer,
or consult your system administrator;
printing continues"
;;
W )
width=${cols}
errmsg WARNING ${E_IP_BAIT}nbsp;\
"can''''t select the page width \"${width}\"" \
"check the valid widths for the printer,
or consult your system administrator;
printing continues"
;;
L )
length=${lines}
errmsg WARNING ${E_IP_BLNT} \
"can''''t select the page length \"${length}\"" \
"check the valid lengths for the printer,
or consult your system administrator;
printing continues"
;;
S )
errmsg WARNING ${E_IP_DHRET} \
"can''''t select the character set \"${CHARSET}\"" \
"check the name given in the -S option,
or consult your system administrator;
printing continues"
;;
esac
done


###########
##
## Print some copies of the file(s)
###########

#####
#
# The protocol between the interface program and the Spooler
# is fairly simple:
#
# All standard error output is assumed to indicate a
# fault WITH THE REQUEST. The output is mailed to the
# user who submitted the print request and the print
# request is finished.
#
# If the interface program sets a zero exit code,
# it is assumed that the file printed correctly.
# If the interface program sets a non-zero exit code
# less than 128, it is assumed that the file did not
# print correctly, and the user will be notified.
# In either case the print request is finished.
#
# If the interface program sets an exit code greater
# than 128, it is assumed that the file did not print
# because of a printer fault. fns;an alert isn''''t already
# active (see below) one will be activated. (Exit code
# 128 should not be used at all. The shell, which executes
# this program, turns SIGTERM, used to kill this program
# for a cancellation or disabling, into exit 128. The
# Spooler thus interpretes 128 as SIGTERM.)
#
# A message sent to the standard input of the ${LPTELL}
# program is assumed to describe a fault WITH THE PRINTER.
# The output is used in an alert (if alerts are defined).
# If the fault recovery is "wait" or "begin", the printer
# is disabled (killing the interface program if need be),
# and the print request is left on the queue.
# If the fault recovery is "continue", the interface program
# is allowed to wait for the printer fault to be cleared so
# it can resume printing.
#
# This interface program relies on filters to detect printer faults.
# In absence of a filter provided by the customer, it uses a simple
# filter (${LPCAT}) to detect the class of faults that caus&pDD# the filter:
#
# The filter should exit with zero if printing was
# successful and non-zero if printing failed because
# of a printer fault. This interface program turns a
# non-zero exit of the filter into an "exit 129" from
# itself, thus telling the Spooler that a printer fault
# (still) exists.
#
# The filter should report printer faults via a message
# to its standard error. This interface program takes all
# standard error output from the filter and feeds it as
# standard input to the ${LPTELL} program.
#
# The filter should wait for a printer fault to clear,
# and should resume printing when the fault clears.
# Preferably it should resume at the top of the page
# that was being printed when the fault occurred.
# If it waits and finishes printing, it should exit
# with a 0 exit oe&bsp;If it can''''t wait, it should exit
# with a non-zero exit code.
#
# The interface program expects that ANY message on the
# standard error from the filter indicates a printer fault.
# Therefore, a filter should not put user (input) error
# messages on the standard error, but on the standard output
# (where the user can read them when he or she examines
# the print-out).
#
#####

badfileyet=
EXIT_CO={MPREFIX}e
trap ''''catch_hangup; echo 129 >${EXIT_CODE}; x_oe=129 exit&nbp;129'' 1
trap ''''catch_interrupt; echo 129 >${EXIT_CODE}; etcd=129 exit 129'''' 2 3

#####
#
# Here''''s where we set up the $LPTELL program to capture
# fault messages. It is at the other end of the shell pipeline;<#ns;h&bsp;``left-hand'''''''' side of the pipeline is the following loop.
#
# while [ $i -le $copies ]
# do
# ...
# done | ${LPTELL} ...
#
# WARNING: The standard output of the following loop is directed
# to $LPTELL, not the printer. To send something to the printer,
# direct it to channel 3. E.g. echo "output" 1>&3
#
# WARNING: Because this loop is the first in a pipeline, it is in
# a sub-shell. To propagate an exit code to the original shell,
# copy it into the file ${EXIT_CODE}.
##########
exec 3>&1
i=1
while [ $i -le $copies ]
do

#####
# Set FORMFEED to be a pipeline that will simulate a formfeed r &bsp;if we don''''t have a real formfeed and want filebreaks.
#####
if [ -z "${FF}" -a "no" = "${nofilebreak}" -a -n "${LPPAGER}" ]
then
FORMFEED="${LPPAGER} ${length}"
fi

n=1
for file in ${files}
do

#####
# Set FORMFEED to be a pipeline that will simulate a
# fofe&bsp;if we don''''t have a real&s;omfeed and DON''''T
# want filebreaks--last file only.
#####
if [ \
-z "${FF}" \
     -a "yes" = "${nofilebreak}" \
     -a -n "${LPPAGER}" \
     -a "${n}" = "${nfiles}" \
]
then
FORMFEED="${LPPAGER} ${length}"
fi

if [ -r "${file}" ]
then r b> #####
# Here''''s where we print the file.
# Put the 0<${file} before the "eval" to keep
# clever users from giving a file name that
# evaluates as something to execute (like LPTELL!)
# We send the standard output of the
# filter directly to the printer, while
# piping the standard error to $LT. trap '''''''' 1 # Let the filter handlen;&bphnup
trap '''''''' 2 3 # and interrupts
if [ -z "${FORMFEED}" ]
then
0<${file} eval ${FILTER} 2>&1 1>&3
exit_code=$?
else
exec 4>&1
(
0<${file} eval ${FILTER} 2>&4
echo $? >${EXIT_CODE}
) | eval ${FORMFEED} 1>&3
exec 4>&-
exit_code=`cat ${EXICD}
fi
trap ''''catch_hangup; echo 1&bp;>${EXIT_CODE};&nsp;ext''' 1
trap ''''catch_interrupt; echo 9ns;>${EXIT_CODE}; exit'''' 2 3

if [ 0 != "${exit_code}"&b] trap '''''''' 15
sleep 4
exit_code=129
echo ${exit_code} >${EXIT_CODE}
exit ${exit_code}
fi

if [ -n "${FF}" -a "no" = "${nofilebreak}" ]
then
echo "${CR}${FF}\c" 1>&3
fi

else

#
# Don''''t complain about not being able to read
# a file on second and subsequent pe,nbsp;unless
# we''''ve not complained yet. This removes repeated
# messages about the same file yet reduces the
# chance that the user can remove a file and not
# know that we had trouble finding it.
#####
if [ "${i}" -le 1 -o -z "${badfileyet}" ]
then
errmsg WARNING ${E_IP_BADFILE} \
"cannot read file \"${file}\"" \
"see if the file still exists and is readable,
or consult your system administrator;
printing continues"
badfileyet=yes
fi

fi
n=`expr $n + 1`

done
i=`expr $i + 1`

done | ${LPTELL} ${printer}
exec 3>&-

exit_code=`cat ${EXIT_CODE} 2>/dev/null`
if [ -n "${exit_code}" -a 0 != "${exit_code}" ]
then
exit ${exit_code}
fi

if [ -n "${FF}" -a "yes" = "${nofilebreak}" ]
then
echo "${CR}${FF}\c"
fi

原文转自:http://www.ltesting.net