Mit Shell-Kommandos starten und verwalten Sie Druckjobs ohne viel Herumgeklicke. Probleme mit bestimmten Dateiformaten lassen sich dabei einfach umgehen.
Wenn Sie PDF-Dateien drucken möchten, öffnen Sie sie normalerweise einzeln mit einem PDF-Betrachter wie Okular oder Atril und starten dort den Ausdruck. Das kostet zum einen wertvolle Zeit und birgt zum anderen die Gefahr, einige Dateien zu übersehen und auszulassen. Auf der Konsole klappt der Ausdruck dagegen oft mit einer einzigen Eingabe, wenn es sich um bestimmte Dateiformate handelt, insbesondere bei Postscript- und PDF-Dokumenten.
Drucken mit Lpr
Mit den Kommandos lp und lpr erledigen Sie den Ausdruck einer oder mehrerer Dateien. Beim Absetzen eines Druckbefehls an den Standarddrucker unterscheiden sich die Aufrufe nicht: lp Datei und lpr Datei. Möchten Sie den Auftrag auf einem bestimmten Gerät ausgeben, übergeben Sie dessen Namen über den Parameter -d (bei Lp) respektive -P (bei Lpr). Auch ein Aufruf aus der Pipe funktioniert: echo "Hi!" | lpr oder echo "Hi!" | lp bringen die Ausgabe direkt aufs Papier. Mehrfachausdrucke fordern Sie mit -n Anzahl (bei Lp) beziehungsweise -# Anzahl (bei Lpr) an.
Ein Druckauftrag für mehrere Dateien in einem einzigen Befehl fasst die Seiten sowohl bei Lp als auch bei Lpr zu einem einzigen Druckjob zusammen. Das kann bei Druckerstörungen Probleme bereiten, wenn etwa der Drucker streikt und Seiten wegen eines Papierstaus verschluckt. Zudem taucht bei der Auftragsabfrage nur der Name der im Alphabet letzten auszudruckenden Datei auf. Das Kommando lpq zeigt zwar die komplette Warteschlange an, was jedoch in der Praxis bei umfangreichen zusammengefassten Druckaufträgen ebenfalls zu Problemen führen kann. Es kostet durchaus Mühe, eine durch eine Störung nicht gedruckte Datei zu identifizieren und einen Nachdruck zu starten. Mehr Übersicht ermöglicht das Vorgehen, die Jobs einzeln zu starten. Hier hilft ein kleines For-Konstrukt (Listing 1). Abbildung 1 verdeutlicht den Unterschied zwischen den beiden Methoden, Druckjobs zu starten.

Abbildung 1: Druckjobs mit mehreren Dateien lassen sich am Stück (oben) oder per Skript in Scheiben (unten) starten.
Listing 1
mdruck.sh
#! /bin/bash # Drucke jede gefundene PDF-Datei # in einem einzelnen Aufruf auf # dem Standarddrucker: for i in $(ls -1 *.pdf); do echo "Druck von $i" lpr $i done # Zeige die aktuellen Aufträge # auf dem Standarddrucker an: lpq
Direttissima
Sowohl Lp als auch Lpr ermöglichen es, Textdateien oder bereits für den Druck aufbereitete Dateien direkt zu drucken. Cups [1] nimmt dabei keine Veränderungen an der “Nutzlast” vor. Zeilendrucker, die mit Endlospapieren oder -aufklebern arbeiten, können damit die volle Seitenlänge (normalerweise 12 Zoll) nutzen. Ein laufendes Konfigurieren auf diese Papierlänge erübrigt sich damit.
Als Befehle zum Druck solcher Dateien verwenden Sie lpr -o raw Datei beziehungsweise lp -o raw Datei. Bei Textdateien bringt das bei Zeilendruckern (Nadel oder Tinte) Geschwindigkeitsvorteile. Ein sowieso langsamer Seitendrucker (Laser) wird damit nicht schneller, da er das Papier stets in derselben Geschwindigkeit transportiert.
Einige Druckerhersteller ermöglichen über Raw-Aufrufe auch die Konfiguration eines Druckers, darunter Kyocera mit der Kommandosprache Prescribe II. Die erste Zeile aus Listing 2 schreibt eine Kommandofolge in dieser Sprache in die Datei pre.txt. Die folgenden beiden Kommandos drucken die Datei einmal normal und einmal im Raw-Modus aus. Abbildung 2 zeigt den Unterschied – oben die gefilterte reguläre Druckausgabe, unten die vom Drucker als Anforderung einer Statusseite interpretierte Raw-Variante.
Listing 2
Prescribe II
$ echo "!R! STAT; EXIT;" > pre.txt $ lpr pre.txt $ lpr -o raw pre.txt

Abbildung 2: Die beiden Befehle aus Listing 2 liefern ganz unterschiedliche Ergebnisse.
Sysadmins können solche Kommandosprachen für die Konfiguration oder auch zu speziellen Einstellungen für Druckjobs nutzen. Gleichzeitig eröffnet das den Nutzern aber auch Möglichkeiten für unerwünschte Nutzung und unbefugte Eingriffe in die Geräteeinstellungen.
Ein weiteres Einsatzgebiet ergibt sich beim Arbeiten an einem Arbeitsplatz, an dem zwar der gewünschte Drucker nicht verfügbar ist, man aber nicht auf ein allgemeines Format wie PDF zurückgreifen möchte oder kann. Hier erstellen Sie mit dem Druckertreiber des fraglichen Zielgeräts eine Raw-Datei (In Datei drucken) und transportieren sie auf beliebigem Weg zu einem Rechner, der auf den Drucker zugreifen kann. Von dort aus schicken Sie diese Datei direkt zum Drucker, ohne dass Cups irgendwelche Änderungen daran vornimmt.
Die weiteren Optionen von Lp und Lpr beziehen sich auf den Duplexdruck, das Drucken einzelner Seiten, die Einstellung des Papierformats und die Seitenanpassung. Auch ein Zusammenfassen mehrerer Seiten bieten die beiden Kommandos an. Bei Lp können Sie zudem auf die Druckqualität Einfluss nehmen.
Alternativen
Es gibt noch andere Shell-Befehle, die einen direkten Ausdruck von Textdateien ermöglichen. Dabei stehen in der Regel zusätzliche Formatierungsmöglichkeiten zur Verfügung.
So gibt Enscript seine Ergebnisse nicht nur auf den Drucker aus, sondern kann stattdessen auch Postscript-, HTML- oder RTF-Dateien erstellen. Leselinien im Stil von Tabellenpapier, Zeilennummern und Syntaxhervorhebung für viele Skript- und Programmiersprachen zählen zu den weiteren Extras. Allerdings kommt Enscript nicht mit UTF-8 zurecht. Gegebenenfalls konvertieren Sie deshalb den Dateiinhalt vorab per Iconv oder Recode nach latin1 oder ISO-8859-15.
Ein Beispiel zeigt Listing 3. Mit Cat geben Sie den Dateiinhalt in die Pipe aus, Recode stellt den Zeichensatz um. Das Ergebnis wandert wiederum über die Pipe an Enscript weiter. Das Tool unterdrückt den Seitenkopf (-B) und hinterlegt jede zweite Zeile (-H1) grau. Die Graustufe legen Sie mittels --highlight-bar-gray fest. Den Drucker geben Sie hinter -P an oder leiten bei Bedarf die Ausgabe via -o Datei in eine Datei um.
Listing 3
Enscript
$ cat Textdatei | \ recode UTF8..ISO8859-15 | \ enscript -B -H1 \ --highlight-bar-gray=.8 \ -P <I>Drucker<I>
Auch der Editor Vim kann Textdateien direkt drucken und beherrscht dabei Verfeinerungen wie Syntaxhervorhebung, Duplexdruck und Angabe der Papiergröße. Listing 4 liefert ein einfaches Beispiel.
Listing 4
Vim
$ vi -c ':hardcopy :set pdev=Drucker | q' Textdatei
Korrekturabzüge
Speziell für das Korrekturlesen nutzt man Ausdrucke mit einem weiteren, üblicherweise 1,5-fachen oder doppelten Zeilenabstand. Mit Latex erstellen Sie solche Korrekturdrucke ziemlich einfach über den Umweg einer PDF-Datei, die Sie dann mit Lp/Lpr ausdrucken. Möchten Sie Ihre Korrektur- und Änderungsanweisungen direkt am Bildschirm in die PDF-Datei einbringen, bearbeiten Sie sie mit Xournal [2].
Das Shell-Skript manudruck.sh aus Listing 5 versammelt alle notwendigen Schritte, um einen zweizeiligen Ausdruck in einer Monospace-Schrift zu erhalten. Außerdem erhält der Ausdruck eine Absatznummerierung, sodass Sie beim Einpflegen der Korrekturen die zu ändernden Positionen leichter finden. Listing 6 enthält den Inhalt der Datei kopf.tex mit der Bestimmung des Zeilenabstands, Listing 7 den von ende.tex mit den Abschlusszeilen des als Zwischenstufe erzeugten TeX-Dokuments. Das verarbeitet Pdflatex zur Zieldatei druck.pdf weiter, die Sie optional direkt per Lpr auf den Drucker ausgeben. Dazu entfernen Sie das Kommentarzeichen # vor der letzten Zeile im Skript.
Listing 5
manudruck.sh
#! /bin/bash if [ -z $1 ]; then echo "Kein Dateiname angegeben" exit fi cat $1 | nl -ba -n ln | fold -sbw 70 > druck.txt cat kopf.tex druck.txt ende.tex > druck.tex pdflatex druck.tex # Optional gleich ausdrucken: # lpr druck.pdf
Listing 6
kopf.tex
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
%% Einzeilig
%\usepackage[singlespacing]{setspace}
%% Eineinhalbzeilig
%\usepackage[onehalfspacing]{setspace}
%% Zweizeilig
\usepackage[doublespacing]{setspace}
\begin{document}
\begin{verbatim}
Listing 7
ende.tex
\end{verbatim}
\end{document}
Bilder drucken
Bilddateien in den gängigen Formaten JPEG, PNG und EPS können Sie ohne Weiteres direkt via Lp oder Lpr ausdrucken. Etwas komplizierter gestaltet sich die Ausgabe von SVG-Vektorgrafiken, die Sie dazu vorab über Rsvg-convert in ein PDF konvertieren müssen:
$ rsvg-convert -f pdf Datei.svg | lpr
Das setzt voraus, dass das Paket librsvg2-bin auf dem Rechner installiert ist, und funktioniert nicht immer ganz zuverlässig.
Druckerwarteschlangen
Egal, ob Sie Ausdrucke mit Shell-Befehlen oder aus einer Anwendung heraus anstoßen: Die Druckaufträge landen in der Reihenfolge ihrer Entstehung in einer Warteschlange. Der Spooler Cups sendet sie dann einzeln nacheinander zum Drucker. Je mehr Speicher das Drucksystem zur Verfügung hat, desto mehr Aufträge kann es entgegennehmen. Kommt es aber beispielsweise zu einem Stromausfall, gehen diese Aufträge verloren. Für die Warteschlange erscheinen solche Jobs als erledigt.
Für jeden Drucker wird mindestens eine Warteschlange angelegt, es können aber für dasselbe Gerät mehrere bereitstehen. Das hat den Vorteil, dass man nur noch eine passende Warteschlange wählen muss, statt sich mit verschiedenen Druckereinstellungen herumzuschlagen. Das Einbinden von Druckern in ein Linux-System erfolgt über diverse GUI-Programme, das Web-Frontend von Cups oder mit den hier aus Platzgründen nicht weiter besprochenen Shell-Befehlen Lpinfo, Lpadmin und Lpoptions.
Warteschlangen anzeigen
Mit der Eingabe lpq fragen Sie die Warteschlange des Standarddruckers ab. Für alle anderen Drucker geben Sie analog zum Druckbefehl mit lpq -P Drucker den entsprechenden Warteschlangennamen an.
Das Kommando lpq -a listet alle Druckaufträge auf (Abbildung 3). Sie sehen die Auftragsnummer, mit der Sie einen Druckauftrag zum Verschieben oder Löschen ansprechen, und erkennen, zu welchem Benutzer ein Auftrag gehört. Der Rang active besagt, dass das System den Druckauftrag aktuell abarbeitet. Scheitert der Ausdruck eines aktiven Auftrags beispielsweise durch einen Speicherüberlauf oder einen Fehler beim Papierformat, blockiert er die Warteschlange im Rang active. Abhilfe schafft das Löschen und erneute Starten des Auftrags, gegebenenfalls mit passenden Anweisungen bezüglich des Papierformats, der Druckdichte und so weiter.
Der Shell-Befehl Lpstat kann ebenfalls Druckerwarteschlangen anzeigen. Die Tabelle “Lpstat-Optionen” fasst die wichtigsten Informationsmöglichkeiten zusammen, Abbildung 4 zeigt einige der entsprechenden Aufrufe. Bei der Auflistung mit dem Schalter -o liefert Lpstat Warteschlangennamen (also quasi den Drucker) zusammen mit der Auftragsnummer, dem Eigentümer des Druckauftrags, der Größe und des Startdatums samt Uhrzeit. Mit -u User beschränken Sie die Ausgabe auf den angegebenen Benutzer. Die Reihung (-R) orientiert sich am Erstellungszeitpunkt.
|
Option |
Aktion |
|---|---|
|
|
alle Druckaufträge auflisten |
|
|
alle Druckaufträge von User auflisten |
|
|
Rangliste der Druckaufträge (nur eigene) |
|
|
Rangliste der Druckaufträge von User |
|
|
Standarddrucker ermitteln |
|
|
Liste verfügbarer Drucker |
|
|
Liste aktiver Drucker |
|
|
Status des Druck-Daemons |
Druckaufträge manipulieren
Mit dem Befehl lprm Auftragsnummer entfernen Sie einen einzelnen Druckauftrag aus der Warteschlange. Die Aufträge in anderen Warteschlangen bleiben dabei erhalten. Daneben besteht auch die Möglichkeit, über lprm - alle Druckaufträge aus der Warteschlange zu verbannen, auf die Sie Zugriff haben. Abbildung 5 demonstriert den Ablauf für einen einzelnen und für alle Druckaufträge, wobei zwischendurch jeweils Lpq die Druckaufträge für den Standarddrucker anzeigt.
Daneben können Sie Druckaufträge auch verschieben, etwa bei Auslastungsproblemen oder Geräteausfällen. Dazu ermitteln Sie zuerst die Auftragsnummern und reichen diese dann zusammen mit dem neuen Zielgerät an Lpmove weiter: lpmove Auftragsnummer Drucker. Abbildung 6 verdeutlicht das Vorgehen und die Kontrolle des Ergebnisses mit Lpq.
Helferlein
Ist Smenu [3] auf dem System installiert, können Sie den Shell-Code für ein Druckauswahlmenü aus Listing 8 direkt in eigene Skripte einbauen. Er lässt sich auch als Funktion definieren und so mehrfach im Skript aufrufen (siehe auskommentierte Zeilen). Den gewünschten Drucker wählen Sie entweder über die Pfeiltasten oder per Zifferntaste aus, Abbildung 7 zeigt den Ablauf und die Kontrollausgabe.
Listing 8
druckwahlskript.sh
#! /bin/bash
# Funktionskopf
# dru() {
# Bildschirm löschen
# clear
ziel=$(lpstat -a | cut -d \ -f1 | smenu -N -n5 -c -m "Drucker auswählen:")
# Nur Kontrollausgabe
echo $ziel
# Hier muss die Zeile mit dem
# Druckbefehl stehen, z.B.:
# lpr -P $ziel
# oder Einbau in eine Pipe
# Ende der Funktion
# exit 0
# }
# Aufruf der Funktion
# dru
Statusanzeige
Das Shell-Skript druckjobs.sh aus Listing 9 listet automatisch fortlaufend sämtliche Warteschlangen, deren ranghöchsten drei Aufträge sowie die Gesamtzahl der Aufträge je Gerät auf. Ein Refresh der Informationen erfolgt alle drei Sekunden. In Abbildung 8 sehen Sie den Ablauf. Das Skript nutzt einige Spielereien wie farbige und invertierte Ausgaben, die nicht in jeder Terminalanwendung funktionieren. Gegebenenfalls lassen Sie die entsprechenden Escape-Sequenzen (\e[...m) auf Ihrem Rechner einfach weg. (jlu)
Listing 9
druckjobs.sh
#! /bin/bash
while true; do
echo -e "\e[32m----------------------------------------------\e[0m"
datum=$(date)
echo -e "\e[31m\e[1mÜbersicht Druckaufträge $datum\e[0m"
for dru in $(lpstat -a | cut -d \ -f1); do
jobzahl=$(lpq -P$dru | sed 1,2d | wc -l)
echo -e "\e[32m----------------------------------------------\e[0m"
echo -e "\e[7mDrucker: $dru $jobzahl Aufträge \e[0m"
# Wenn die ESC-Anweisungen nicht klappen:
# echo "Drucker: $dru $jobzahl Aufträge"
lpq -P $dru | sed 1,2d | head -3
done
sleep 3
clear
done

Abbildung 8: Das Skript druckjobs.sh liefert eine schicke, fortlaufend aktualisierte Statusanzeige aller Druckaufträge.
Glossar
-
Cups
-
Common Unix Printing System. Das seit 2007 unter der Ägide von Apple stehende freie Drucksystem ermöglicht das Drucken unter verschiedensten unixoiden Betriebssystemen.
Infos
-
Cups verwalten: Harald Zisler, “Drucken auf Kommando”, LU 09/2016, S. 69, https://www.linux-community.de/37207
-
Xournal: Erik Bärwaldt, “Virtuelle Tafel”, LU 03/2021, S. 29, https://www.linux-community.de/43939
-
Smenu: Harald Zisler, “Keine Qual der Wahl”, LU 06/2017, S. 84, https://www.linux-community.de/38772










