9.5. 使用印表機

這一節將告訴你如果使用你在 FreeBSD 下設定的印表機。這裡有一份使用者等級命令的概述。

lpr(1)

列印工作

lpq(1)

檢查印表機佇列

lprm(1)

將工作從印表機佇列中移除

也有系統維護使用的命令, lpc(8),用來控制印表機及其佇列。在 管理印表機 這一節裡有更詳細的說明。

lpr(1)lprm(1)lpq(1) 這三個命令都接受 -P printer-name 這個指定在 /etc/printcap 檔裡設定的印表機/佇列的參數。允許你對不同的印表機做要求、移除, 以及檢查工作。如果你沒有使用 -P 參數,那麼這些命令將使用 PRINTER 環境變數所指定的印表機。若你也沒有 PRINTER 環境變數, 那麼這些命令則會對別名為 lp 的印表機動作。

此後,預設印表機這個指的就是以 PRINTER 環境變數設定的印表機或是當 lp 環境變數不存在時,別名為 lp 的印表機。

9.5.1. 列印工作

若要列印檔案,輸入:

    % lpr filename ...

這將把所有列出的檔案以預設印表機列印。如果你沒有指定任何檔案,那麼 lpr(1) 將會從標準輸入讀入資料。下面這個例子將會印出一些重要的 系統檔:

    % lpr /etc/host.conf /etc/hosts.equiv

若要指定以特定的印表機輸出,輸入:

    % lpr -P printer-name filename ...

下面這個例子會將目前目錄下的檔案列表從名為 rattan 印表機輸出:

    % ls -l | lpr -P rattan

因為 lpr(1) 命令之後沒有指定任何一個檔案, lpr 將會從標準輸入讀入資料以印出,即由 ls -l 命令所產生的輸出。

lpr(1) 命令有許多參數如控制輸出格式、套用檔案轉換、 一次印出多份,等等。請參見 列印參數 這一節裡有更詳細的說明。

9.5.2. 檢查列印工作

當你使用 lpr(1) 列印時,一起送到 LPD spooling 系統的資料稱為一個 ``列印工作''。 每一台印表機都有一個列印工作佇例, 而你的列印工作和其他的列印工作一樣在佇列裡等待列印。 印表機會將先列印先送達的工作。

要顯示預設印表機的佇例,輸入 lpq(1) 即可。 若要指定印表機,請指定 -P 參數。例如

    % lpq -P bamboo
這個命令會顯示叫做 bamboo 的印表機佇列。這裡有一份 lpq 命令的輸出範例:

    bamboo is ready and printing
    Rank   Owner    Job  Files                              Total Size
    active kelly    9    /etc/host.conf, /etc/hosts.equiv   88 bytes
    2nd    kelly    10   (standard input)                   1635 bytes
    3rd    mary     11   ...                                78519 bytes

上面顯示一共有三個工作在 bamboo 的佇列裡。 第一個工作由使用者 kelly 送出,``工作代碼''為 9。 每一個工作都會有個唯一的工作代碼。通常你可以忽略工作代碼, 但是如果你要取消某個工作時,你就會需用知道工作代碼。詳情請參見 移除印列工作這一節。

工作代碼 9 裡包含了兩個檔案。用 lpr(1) 送多個檔案將會被視為同一個工作。這是目前正在處理的工作(注意 ``Rank'' 欄標示的 active), 即印表機現在應該就在列印這個工作。第二個工作的資料是用 lpr(1) 從標準輸入接收資料的。而第三個工作是由使用者 mary 送出的。這是一個較大的工作。而她要列印的檔案因為太長而放不下,所以 lpq(1) 命令只顯示三個點。

lpq(1) 最前面的輸出通常可以看出印表機現在在做什麼(至少是 LPD 覺得印表機現在應該是在做什麼)。

lpq(1) 命令可以使用 -l 參數以得到更詳細的 列表。這裡有一個 lpq -l 的輸出範例:

    waiting for bamboo to become ready (offline ?)
    kelly: 1st				 [job 009rose]
           /etc/host.conf                    73 bytes
           /etc/hosts.equiv                  15 bytes
    
    kelly: 2nd				 [job 010rose]
           (standard input)                  1635 bytes
    
    mary: 3rd                                [job 011rose]
          /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes

9.5.3. 移除列印工作

如果你改變心意不想列印你的工作了,你可以用 lprm(1) 這個命令把他們從列印佇列串移除。通常你也可以用 lprm(1) 把一個正在處理的工作移除,不過可能還是會印出部份或是全部的文件。

要從預設印表機裡移除工作,首先,用 lpq(1) 找出工作代碼, 然後輸入:

    % lprm job-number

如果要從指定的印表機移除工作,那麼用 -P 參數。 下列的命令從印表機 bamboo 的佇列中移除工作代碼為 10 的工作:

    % lprm -P bamboo 10

lprm(1) 命令有一些常用的用法:

lprm -

將(預設印表機)裡所有屬於你的工作都移除。

lprm user

將(預設印表機)裡所有屬於使用者 user 的工作皆移除。 只有超級使用者可以移除其他人的工作,你只能移除你自己的工作。

lprm

若不指定工作代碼、使用者名稱或是 -lprm(1) 將移除目前預設印表機正在處理的工作, 但前提是這個工作必需是屬於你的。 超級使用者可以移除任何目前正在處理的工作。

若使用 -P 參數配合上述的常用用法, 則上述的動作將對指定的印表機動作而不是對預設印表機。 下列的命令將會移除目前使用者在印表機 rattan 佇列中的所有工作:

    % lprm -P rattan -

Note: 如果你使用的是網路印表機,lprm(1) 將只允許你從送出工作的機器移除該工作。 下面這些命令可以說明這個概念:

    % lpr -P rattan myfile
    % rlogin orchid
    % lpq -P rattan
    Rank   Owner	  Job  Files                          Total Size
    active seeyan	  12	...                           49123 bytes
    2nd    kelly      13   myfile                         12 bytes
    % lprm -P rattan 13
    rose: Permission denied
    % logout
    % lprm -P rattan 13
    dfA013rose dequeued
    cfA013rose dequeued
    	

9.5.4. 在純文字之外:列印參數

lpr(1) 命令提供控制格式輸出、轉換圖形及其他檔案格式、 一次印出多份、工作處理方式等參數。這一節將一一介紹。

9.5.4.1. 格式輸出及轉換的參數

下列的 lpr(1) 命令控制檔案輸出的格式。 如果你的列印工作裡沒有純文字或是你希望純文字透過 pr(1) 處理後以特定的格式輸出時,你可以使用這些參數。

舉例來說,下面的命令從叫做 bamboo 的印表機將 DVI 檔 (由 TeX 排版系統產生) fish-report.dvi 印出:

    % lpr -P bamboo -d fish-report.dvi

這些參數將套用於這個工作裡的每個檔案,所以你不能把 DVI 和 ditroff 檔案在同一個工作裡一起處理, 而要分兩次工作用不同的轉換參數。

Note: 這些參數除了 -p-T 需要為指定的印表機安裝轉換的過濾程式外,其他的都不用。 舉例來說,參數 -d 需要安裝 DVI 轉換過濾程式。 轉換用的過濾程式 這一節有較詳細的說明。

-c

列印 cifplot 檔案。

-d

列印 DVI 檔案。

-f

列印 FORTRAN 文字檔。

-g

列印 plot 資料。

-i number

將輸出縮排 number 個字元。 如果你省略 number,則縮排 8 個字元。 這個參數只有在某些轉換用的過濾程式上有效。

Note: 請不要在 -i 和數字之間加上空白。

-l

原封不動的印出文字資料,包括控制字元。

-n

列印 ditroff (device independent troff) 資料。

-p

在列印之前以 pr(1) 格式化輸出。請參見 pr(1) 以取得更的資訊。

-T title

title 取代 pr(1) header 中的檔名。這個參數只有在配合 -p 參數使用時才有效。

-t

列印 troff 資料。

-v

列印 raster 資料。

下面是一個以預設印表機列印格式化過的 ls(1) manual page 的範例:

    % zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t

zcat(1) 命令將

ls(1) 原始資料解壓縮並傳送給 troff(1) 命令將該資料格式化後以 GNU troff 格式輸出給 lpr(1) 送給 LPD spooler 處理。因為我們在使用

lpr(1) 命令時使用了 -t 參數,所以 spooler 在印列時會把 GNU troff 轉換成預設印表機所能了解的格式。

9.5.4.2. 工作處理方式參數

下列的參數將會讓 lpr(1) 告訴 LPD 以特別的方式處理工作:

-# copies

將同一工作裡的每個檔案都印出 copies 份。 系統管理者可以將這個參數關閉, 以減低印表機的負擔並鼓勵使用影印機。請參見 限制列印多份 這一節的說明。

這個範例將會從預設印表機印出三份 parser.c,然後印出三份 parser.h

    % lpr -#3 parser.c parser.h
-m

完成列印工作後,寄信通知使用者。若使用這個參數, 當列印工作完成後,LPD 系統將會寄信給你。 在這封信中將會告訴你你的工作是否成功的印出或是有錯誤以及 (通常會)告訴你錯誤的原因。

-s

不要將要列印的檔案拷貝到 spooling 目錄,而只要以 symbolic links 的方式取代。

如果你要列印大的案,你可考慮用這個參數。這可以節省你 spooling 目錄的空間(否則 spooling 目錄所在的檔案系統可能會空間不足)。同時他也可以省下 LPD 將檔案拷貝到 spooling 目錄所需的時間。

這麼做有一個缺點就是當列印還沒結束時, 你不能修改或刪除列印中的檔案,因為 LPD 在列印時還會用到原始的檔案。

Note: 如果你是用網路印表機列印,那麼 LPD 還是會把你的檔案拷貝到遠端的機器,所以參數 -s 只有在本機上列印時才有用。

-r

當你的檔案已經拷貝到 spooling 目錄時,或是用 -s 參數且列印完成時,就將原本的檔案移除。 請小心使用這個參數!

9.5.4.3. Header Page 參數

有一些參數是設定 lpr(1) 列印在 header pages 上的文字。 如果列印 header pages 的話,那麼這些參數就沒有作用了。請參見 Header Pages 這一節以獲知如何設定 header pages。

-C text

將 header page 上的機器名稱以 text 取代。機器名稱通常是印出送出工作的機器名稱。

-J text

將 header 上的工作名稱以 text 取代。工作名稱通常是一份列印工作裡的第一個檔案名稱, 如果你是從標準輸入輸入列印資料的話,那麼將會是 stdin

-h

不要列印 header page。

Note: 在某些機器上,由於 header pages 產生的方式不同, 這個選項可能會無效。請參見Header Pages這一節裡更詳細的說明。

9.5.5. 管理印表機

做為印表機管理員,你必需安裝、設定以及測試他們。你可以用 lpc(8) 這個命令:

我們得先知道的一個觀念是:如果一個印表機已經 停止工作了,他將不會將佇列裡的任何東西印出。 使用者仍然可以將工作送過來,但是這些工作將會在佇列裡等待直到印表機 開始工作或是佇例被清空了。

如果佇列被關閉了,那麼沒有使用者(除了 root 之外)可以將工作送給印表機。只有已經開啟 佇列的印表機可以接受其他人將工作送過來。 一個印表機可以為一個已經關閉的佇列開始工作。 在這個情況下,原本存在佇列中的工作將會一一的被列印直到沒有工作為止。

通常,擁有 root 權限的使用者才可以用 lpc(8) 下命令。 一般的使用者只能用 lpc(8) 命令來查詢印表機工作以及重新啟動當掉的印表機。

以下是一份 lpc(8) 的命令列表。大部份的命令都需要指定 printer-name以指定要對哪一台印表機下命令。 printer-name 也可以用 all 表示所有列在 /etc/printcap 裡的印表機。

abort printer-name

取消目前的工作同時也停止印表機工作。如果佇列為被關閉, 使用者仍然可以送工作給印表機。

clean printer-name

將印表機 spooling 目錄中的舊檔案移除。有時候 LPD 可能沒有把列印完的工作自 spooling 目錄中移除, 尤其是當列印的工作發生錯誤時或是有其他命令將其中止時。 這個命令將會找出這些不該存在於 spooling 目錄中的檔案並將他們移除。

disable printer-name

關閉佇列以停止接收新工作。如果印表機並未停止工作, 那麼佇列中剩餘的工作將會繼續列印直到佇列中沒有工作為止。 關閉佇列後,root 仍然可以繼續送工作給印表機。

這個命令在你測試一台新印表機或是新的過濾程式程式時特別有用: 你可以將佇列關起來然後以 root 送測試列印的工作。 其他使用者則無法將工作送過來,除非你測試完畢後將佇列以 enable 命令開啟。

down printer-name message

這個命令等於是disable 後再接著 stop 命令。其中 message 是當有使用者以 lpq(1) 檢查印表機佇列或是以 lpc status 命令檢查印表機狀態時所顯示的訊息。

enable printer-name

將印表機佇列開啟。如此使用者就可以將工作送給印表機, 但是只有在印表機已經開始工作後,佇列裡的工作才會被印出來。

help command-name

command-name 命令的說明印出。 如果沒有指定 command-name, 那麼將會印出所有可用的命令。

restart printer-name

動新啟動印表機。如果因為某些情況使得 LPD 當掉了, 一般的使用者可以用這個命令將印表機重新開始工作。 但是他們無法用這個命令讓由 stopdown 命令所停止的印表機開始工作。 restart 命令等於 abort 再接著 start 命令。

start printer-name

讓印表機開始工作。印表機將會將佇列裡的工作印出。

stop printer-name

停止印表機工作。 印表機將會先完成目前的工作然後停止印佇列中的任何工作。 印表機停止工作後,使用者仍然可以把工作送給一個未關閉的佇列中。

topq printer-name job-or-username

將印表機 printer-name 佇列中工作代號為 job 或是屬於使用者 username 的工作移到佇列的最前端。在這個命令裡,你不可以將 all 填在 printer-name 指定所有的印表機。

up printer-name

這是和 down 命令相對的指命。等於是 start 後再接著 enable 命令。

lpc(8) 能以參數的方式接受上述的命令。如果你不輸入任何命令, lpc(8) 將會進入交談模試,在這裡你可以一直輸入命令直到你以 exit命令、quit 命令或是輸入檔案結尾字元為止。