Für wiederkehrende Aufgaben lohnen sich automatisierte Lösungen. Mit einfachen Shell-Skripten erstellen Sie Druckausgaben oder verwalten Ihre Drucker.
Wer mit LibreOffice oder einer Bildbearbeitung wie Gimp arbeitet, muss nicht lange nach der Druckfunktion suchen. Das Druck-Icon findet sich meist gleich links oben in der Funktionsleiste, ersatzweise genügt ein Druck auf [Strg]+[P]. In vielen Situationen wäre es allerdings praktisch, auf eine Anwendung verzichten zu können – etwa, wenn man aus einem Skript heraus drucken möchte.
Per Shell-Befehl lassen sich auch komplexe Druckbefehle absetzen. So gibt es Anweisungen, um mehrere Seiten auf einem Blatt unterzubringen, für Duplexdruck oder Deckblätter, die das Sortieren erleichtern, oder Optionen zum Ändern der Seitenausrichtung.
Prinzipiell offeriert Linux mit lp und lpr zwei Kommandos, um Drucker von der Befehlszeile aus anzusteuern. Die Tabelle “Druckbefehle” zeigt einige wichtige Möglichkeiten auf. Die Optionen für die beiden Befehle fallen sehr umfangreich aus, die Tabelle “Druckoptionen” erklärt einige wichtige Varianten für den Alltag. Für die Einstellungen zum Papier und anderes ziehen Sie die umfangreichen Manpages von Lp [1] und Lpr [2] zurate.
|
Aktion |
Lp |
Lpr |
|---|---|---|
|
Ausgabe auf Standarddrucker |
|
|
|
Ausgabe mit Druckerangabe |
|
|
|
Anzahl Kopien (max. 100) |
|
|
|
ohne Filter drucken |
|
|
|
zu druckende Seiten |
|
– |
|
Aktion |
Eingabe |
Hinweis |
|---|---|---|
|
Papiergröße |
|
zum Beispiel |
|
Querformat |
|
– |
|
einseitiger Druck |
|
– |
|
Duplexdruck |
|
Bindekante an langer Seite |
|
Duplexdruck |
|
Bindekante an kurzer Seite |
|
an Seitengröße anpassen |
|
– |
|
mehrere Seiten auf einem Blatt zusammenfassen |
|
Mögliche Werte: |
Warteschlangen anzeigen
Den Status zu den aktuell anstehenden Druckaufgaben lassen Sie sich über die Kommandos lpq oder lpstat ausgeben. Ohne weitere Optionen ausgeführt, zeigen beide Befehle die Warteschlange des Standarddruckers an. Optional geben Sie mit der Option -P Drucker den gewünschten Drucker an.
Alle Drucker und deren augenblicklichen Zustand erhalten Sie entweder mit lpstat -a, lpstat -o oder lpq -a (Abbildung 1). Das Kommando lpstat -t liefert eine umfassende Übersicht über Drucker, Warteschlangen und Aufträge.

Abbildung 1: Die in der Warteschlange abgelegten Druckaufträge lassen sich auf vielen Wegen abfragen.
Liegen Druckaufträge vor, erhalten Sie eine Ausgabe wie in Abbildung 2 gezeigt. Unter anderem finden Sie hier die Jobnummer, mit der Sie bei Bedarf einen Druckauftrag in der Warteschlange verwalten. Für verschiedene Aktionen müssen Sie die Druckauftragsnummer aus den Ausgaben extrahieren.

Abbildung 2: Die mit Bindestrich an den Druckernamen angehängte Zahl entspricht der Nummer des Druckauftrags.
Mittels des Kommandos aus Listing 1 filtern Sie die Nummer des aktuellen Druckauftrags aus dem Statusbericht. Anhand der Nummer erhalten Sie erweiterte Auskünfte zum Druckauftrag, können den zugehörigen Auftrag löschen oder ihn auf einen anderen Drucker verschieben.
Listing 1
$ lpq -al | grep job | cut -d\[ -f2 | cut -d ' ' -f2
Druckaufträge managen
Den Abbruch eines Druckauftrags fordern Sie mit lprm Auftragsnummer oder cancel Auftragsnummer an. Die Auftragsnummer erhalten Sie über die Anzeige der Warteschlange via lpq -a. Um einen Druckjob abzubrechen, müssen Sie entweder Eigentümer des Druckjobs sein oder entsprechende administrative Rechte besitzen. Mit cancel -a löschen Sie alle aktuellen Druckaufträge, egal, auf welchem Drucker. Geben Sie hinter der Option daher besser den betroffenen Drucker an. In Abbildung 3 kommt Lprm zum Einsatz und löscht einen der vorhandenen Druckaufträge.

Abbildung 3: Landet die hunderseitige Masterarbeit auf dem falschen Drucker, lässt sich der Auftrag auch aus dem Terminal heraus abbrechen.
Falls im laufenden Betrieb ein Drucker ausfällt, Sie aber den Druckauftrag nicht unterbrechen möchten, dann verschieben Sie ihn mittels lpmove auf ein anderes Gerät – entsprechende Rechte vorausgesetzt. Dieses Kommando verwenden Sie in der Form lpmove Jobnummer NeuerDrucker beziehungsweise für alle Druckaufträge eines Druckers mit lpmove AlterDrucker NeuerDrucker. Abbildung 4 zeigt den Umzug von Druckaufträgen vom Drucker laserjet auf lp.

Abbildung 4: Fällt ein Drucker unerwartet aus, lassen sich die Druckaufträge auf einen funktionsfähigen Drucker umleiten.
Aufträge per Skript
Zusammen mit einigen anderen Shell-Funktionen lassen sich die vorgestellten Befehle zu einem Skript zusammenbauen, das Details zu einem Druckjob ausgibt und ihn bei Bedarf auf Knopfdruck löscht (Listing 2). Möchten Sie die Routine als Funktion in Ihren eigenen Shell-Skripten nutzen, schneiden Sie den Quelltext der Funktion djobs () { [...] } heraus und fügen ihn am Anfang Ihres eigenen Programms ein.
Listing 2
#!/bin/bash
djobs () {
clear
echo "Laufende Druckjobs:"
echo "---------------------------------------------------------------"
lpq -a
echo "---------------------------------------------------------------"
echo "Druckjob auswählen: "
dj=$(lpq -al | grep job | cut -d\[ -f2 | cut -d ' ' -f2 | smenu -n10 -t1 )
echo "Ausgewählter Druckjob: $dj"
lpq -a $dj
echo "---------------------------------------------------------------"
aktion=$(echo "Nichts Abbruch" | smenu -m "Aktion auswählen" )
if [ "$aktion" = "Abbruch" ]; then
lprm $dj
if [ $? -eq 0 ]; then
echo "Druckauftrag $dj gelöscht"
fi
sleep 2
fi
exit 0
}
djobs
Mithilfe der Werkzeuge Smenu [3] und Yad [4] (siehe Kasten “Menüwerkzeuge”) lassen sich recht leicht Auswahldialoge verwirklichen. Das Kommandozeilentool Smenu empfiehlt sich für Konsolenritter und Anwender, die über SSH auf einem entfernten Rechner arbeiten. Yad hingegen bietet sich als Option für Nutzer an, die lieber in der Desktop-Umgebung bleiben. Das Programm bringt mithilfe einfacher Anweisungen Fenster auf den Bildschirm.
Menüwerkzeuge
In der Standardinstallation der meisten Distributionen fehlen Smenu und Yad. Über die gleichnamigen Pakete smenu und yad lassen sich jedoch beide Programme schnell aus den Paketquellen einspielen.
Bei Smenu zeigt die Option -m Titel dem Benutzer an, was er auswählt, und gegebenenfalls, warum. Ohne weitere Optionen wählen Sie wortweise innerhalb einer Zeile den gewünschten Eintrag aus. Mit -n Zahl begrenzen Sie die Auswahlzeilen; mit t1 legen Sie fest, dass Smenu die Auswahl zeilenweise mit nur einer Spalte darstellt. Abbildung 5 zeigt den Ablauf des Skripts.

Abbildung 5: Die Funktion djobs() aus Listing 2 hüllt die oft kryptischen Druckkommandos in einfache Dialoge.
Für eine reine Terminalsitzung empfiehlt sich das Skript aus Listing 3. Damit wählen Sie einen Drucker für die Druckausgabe, die Warteschlangenanzeige oder für das Verschieben einer Warteschlange aus. Das Beispiel in Abbildung 6 listet die Druckjobs des betreffenden Druckers auf.
Listing 3
#!/bin/bash
dru () {
clear
ziel=$(/usr/sbin/lpc status all | grep \: | tr -d \: | smenu -n3 -c -m "Drucker auswählen:")
# Beispiel: Warteschlangenausgabe
lpq -P$ziel
exit 0
}
dru

Abbildung 6: Die Funktion dru() aus Listing 3 führt alle verfügbaren Drucker auf und gibt dann die Druckwarteschlange des ausgewählten Geräts aus.
Als grafische Alternative bietet sich Yad an. Ohne viel Programmierarbeit lassen sich mit diesem Werkzeug einfache Anwendungen auf Basis eines Shell-Skripts erstellen. Das Beispiel in Listing 4 zeigt die Auswahl eines Druckers und der auszudruckenden Datei.
Listing 4
#! /bin/sh
dru {
clear
# Drucker auslesen
z=0
dzeile=""
for i in $(/usr/sbin/lpc status all | grep : | tr -d \: ); do
dzeile=$(echo $dzeile$i!)
done
# Menüpunkt mit Yad
drucker=$(yad --title="DRUCKPROGRAMM" --text="Drucker auswählen" --form \
--field="Drucker":CB $dzeile \
--button="Abbruch":1 \
--button="Weiter":2)
if [ $? -eq 1 ]; then
exit
fi
drucker=$(echo $drucker | tr -d \| )
# Beispieldatei drucken
datei=$(yad --title="DRUCKPROGRAMM" --file)
yad --title="DRUCKPROGRAMM" --text="Gewählte Datei $datei ausdrucken?" --yesno
if [ $? -eq 0 ]; then
lpr -P$drucker $datei
fi
exit 0
}
dru
Die Aufrufe von Yad in den Zeilen 12, 22 und 23 fragen zuerst nach dem gewünschten Drucker (Abbildung 7), öffnen dann einen Dialog zur Dateiauswahl (Abbildung 8) und blenden zum Schluss noch eine Bestätigung ein.

Abbildung 7: Per Bash-Skript lassen sich auch Programme mit grafischen Dialogen wie in Listing 4 umsetzen.

Abbildung 8: Das Kommandozeilentool Yad unterstützt dabei Auswahllisten, Dateidialoge und einfache Schalter.
Drucken per Skript
Ständig wiederkehrende Aufgaben, zum Beispiel eine Datenbankabfrage, lassen sich mithilfe eines Shell-Skripts sehr einfach automatisieren und wiederholt in immer derselben Qualität ausführen. Die entsprechenden Kommandozeilenwerkzeuge spucken allerdings in der Regel die Ergebnisse ohne druckbare Formatierung aus.
Mit ein wenig Hilfe durch das Kommando enscript lässt sich die Ausgabe jedoch recht leicht aufarbeiten. Das Ergebnis schreibt Enscript [5] direkt in eine Postscript-Datei und unterstützt auch das Drucken des ausgegebenen Inhalts. Das kommt im Beispielskript aus Listing 5 zur Anwendung.
Listing 5
#!/bin/bash # Datenbankabfrage (PostgreSQL) mit Druckaufbereitung # Auswahl PDF-Datei oder Ausdruck weg=$(echo "Druck PDF" | smenu ) if [ "$weg" = "Druck" ]; then # Drucker auswählen ziel=$(/usr/sbin/lpc status all | grep \: | tr -d \: | smenu -n3 -c -m "Drucker auswählen:") # Datenbankabfrage, Zeichensatzkonvertierung, Druckaufbereitung und Druck psql -P border=3 -c "select * from teile;" | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -P$ziel elif [ "$weg" = "PDF" ]; then # Datenbankabfrage, Zeichensatzkonvertierung, PS-Erzeugung psql -P border=3 -c "select * from teile;" | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o Teileliste.ps # Konvertieren in PDF-Datei ps2pdf14 Teileliste.ps # PS-Datei löschen rm -v Teileliste.ps echo "Abfrage in Teileliste.pdf abgelegt" fi
Dabei gilt es jedoch, darauf zu achten, dass Enscript bislang noch nicht mit UTF-8-kodierten Dateien und Pipes zurechtkommt. Sie müssen daher die Daten im Vorfeld mittels Recode auf den gewünschten Zeichensatz umstellen. Beide Programme arbeiten sowohl in der Pipe als auch mit Dateien. Bei Bedarf lassen sich zudem die PS-Dateien mittels Ps2pdf14 ins PDF-Format umwandeln.
Das Beispielskript in Listing 5 bietet noch viel Potenzial für Verbesserungen und eigene Ideen. Den Ablauf zeigt Abbildung 9, die Ausgabe der Datenbankabfrage sehen Sie in Abbildung 10. Das Skript soll vor allem demonstrieren, mit welch geringem Aufwand sich selbst sehr komplexe Aufgaben lösen lassen. Gegenüber der bei einem Datenbank-Client eines Büropakets nötigen Klickerei erspart das Terminal-Skript viel Arbeit.

Abbildung 9: Listing 5 automatisiert die Abfrage einer PostgreSQL-Datenbank. Zuerst druckt das Skript das Ergebnis direkt aus, danach schreibt es eine PDF-Datei.

Abbildung 10: So kommt die Datenbankabfrage aus dem Drucker. Das Ergebnis bereitet das Kommandozeilenwerkzeug Enscript auf.
Ausgabe aufarbeiten
Der in den Zeilen 10 und 13 von Listing 5 gezeigte Aufruf von Enscript lässt sich bei Bedarf an die eigenen Anforderungen anpassen. So können Sie zum Beispiel einen Ausdruck im Querformat anfordern, Art und Größe der Schrift festlegen und sogar Quelltexte mit Syntaxhervorhebung ausgeben (siehe Kasten “Quellcode in bunt”). Einige der entsprechenden Optionen führt die Tabelle “Optionen zu Enscript” auf.
Quellcode in bunt
In der Regel markieren für das Programmieren gedachte Texteditoren Kommandos, Variablen oder Anweisungen farbig; so lässt sich der Quelltext viel einfacher überblicken. Auch Enscript bietet mit dem Schalter -ESprache eine solche Funktion. Eine Liste mit allen unterstützten Schemata erhalten Sie mit den Kommandos enscript --help-highlight oder enscript --help-pretty-print, je nach Version. Die Anweisung enscript -H1 --highlight-bar-gray=08 -fCourierBold10 --color -Ebash -o Quelltext.sh.ps Quelltext.sh erstellt beispielsweise eine farbige Abbildung des Shell-Skripts Quelltext.sh (Abbildung 11). Zuvor musste auch hier wieder mit Recode der richtige Zeichensatz eingestellt werden.

Abbildung 11: Optional lässt sich die Ausgabe von Enscript auch mit einer Syntaxhervorhebung versehen und so der Ausdruck von Quellcode verbessern.
|
Aktion |
Option |
Hinweis |
|---|---|---|
|
Spaltenangabe |
|
– |
|
Angabe der auszudruckenden Seiten |
|
– |
|
ungerade Seiten ausdrucken |
|
– |
|
gerade Seiten ausdrucken |
|
– |
|
Seitenkopf unterdrücken |
|
– |
|
Jobüberschrift unterdrücken |
|
– |
|
überlange Zeilen kappen |
|
– |
|
Drucker angeben |
|
Auch |
|
Duplexdruck |
|
– |
|
Syntaxhervorhebung |
|
Übersicht mithilfe |
|
Schriftart Text |
|
– |
|
Schriftart Kopf |
|
– |
|
Lesezeilen |
|
|
|
Graustufen bei Lesezeilen angeben |
|
– |
|
Titel |
|
– |
|
Mehrfachausfertigung |
|
– |
|
Ausgabedatei |
|
Auch |
|
Querformat |
|
– |
|
Fußzeile |
|
– |
|
mehrere logische Seiten je Seite |
|
|
Oft gilt es zum Beispiel, Zeilenumbrüche zu vermeiden. Bei überlangen Zeilen hilft es dann, eine kleinere Schriftart zu verwenden oder im Querformat zu drucken. Auch diese Problematik lässt sich per Skript lösen: Mit dem Kommando wc -L ermitteln Sie die Länge der längsten vorkommenden Zeile. Den so gewonnenen Wert ziehen Sie dann als Kriterium zur Festlegung der Schriftgröße und Seitenausrichtung heran:
- Bis 80 Zeichen: 10/12 pt Schriftgröße.
- 80 – 132 Zeichen: 8 pt Schriftgröße oder 10/12 pt und Querformat.
- 132 Zeichen und mehr: 8/10 pt Schriftgröße und Querformat.
Listing 6 zeigt ein Teilskript, das die längste Zeile mithilfe von Wc ermittelt (Zeile 7) und Enscript dann entsprechend anweist, im Querformat zu drucken oder es bei der konventionellen Ausrichtung im Hochformat zu belassen (If-Schleife ab Zeile 10).
Listing 6
#!/bin/bash
# Dateiauswahl
datei=$(ls -1 | smenu -n 10 -t 4)
# maximale Zeilenlänge
mz=$(cat $datei | wc -L)
# Bis 80 Zeichen Hochformat, darüber Querformat
if [ $mz -lt 80 ]; then
cat $datei | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o $datei.ps
elif [ $mz -gt 80 ]; then
cat $datei | recode UTF8..ISO-8859-15 | enscript -r -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o $datei.ps
fi
[... Druckbefehle, PDF-Umwandlung ...]
Fazit
Auch in der Shell und in Skripten müssen Sie nicht auf den Komfort verzichten, den grafische Oberflächen beim Drucken bieten. Druckerauswahl, Warteschlangenverwaltung und das Erstellen ansprechender Druckausgaben bringen Sie ohne großen Aufwand in Ihren Shell-Skripten unter. Dabei müssen Sie weder das Rad neu erfinden noch Programmieren lernen: Simple Shell-Skripte und praktische Kommandozeilenwerkzeuge nehmen Ihnen viel Arbeit ab.
Der Autor
Harald Zisler beschäftigt sich seit den frühen 90er-Jahren mit FreeBSD und Linux. Zu Technik- und EDV-Themen verfasst er Zeitschriftenbeiträge und Bücher.
Infos
-
Manpage zu Lp: http://de.manpages.org/lp
-
Manpage zu Lpr: http://de.manpages.org/lpr
-
Smenu: Harald Zisler, “Keine Qual der Wahl”, LU 06/2017, S. 84, https://www.linux-community.de/38772
-
Yad: Karsten Günther, “Neue Oberfläche”, LU 06/2014, S. 58, https://www.linux-community.de/30568
-
Syntax-Highlighting in LaTeX/Enscript: Harald Zisler, “Alles bunt”, LU 04/2013, S. 48, https://www.linux-community.de/28353





