An einem typischen Tag auf einer typischen Linux-Workstation haben Sie vermutlich viele Anwendungsfenster geöffnet: Webbrowser, Texteditoren, Softwareentwicklungsumgebungen, Musikplayer, Videoeditoren, virtuelle Maschinen und so weiter. Manche Anwendungen sind grafisch orientiert, etwa ein Malprogramm, und auf ein Zeigegerät wie eine Maus oder einen Trackball zugeschnitten. Andere sind eher tastaturorientiert, wie eine Shell in einem Terminalprogramm. Ein typischer Linux-Anwender wechselt wahrscheinlich Dutzende (oder sogar Hunderte) Male pro Stunde zwischen Tastatur und Maus hin und her. Jeder Wechsel kostet Zeit. Er bremst Sie aus. Können Sie die Anzahl der Wechsel reduzieren, können Sie auch effizienter arbeiten.
In diesem Kapitel geht es darum, mehr Zeit an der Tastatur und weniger mit einem Zeigegerät zu verbringen. Zehn Finger, die hundert Tasten drücken, sind oft geschickter als einige weniger Finger auf einer Maus. Ich rede hier nicht nur über die Verwendung von Tastenkürzeln – ich bin zuversichtlich, dass Sie diese auch ohne dieses Buch herausbekommen (obwohl ich einige vorstellen werde). Ich rede über ein anderes Arbeiten, um die Geschwindigkeit alltäglicher Arbeiten hochzudrehen, die inhärent »mausig« wirken: das Arbeiten mit Fenstern, das Abfragen von Informationen aus dem Web und das Kopieren und Einfügen mit der Zwischenablage.
In diesem Abschnitt präsentiere ich Ihnen einige Tipps zum effizienten Starten von Fenstern, vor allem von Shell-Fenstern (Terminals) und Browserfenstern.
Die meisten Linux-Desktopumgebungen, wie GNOME, KDE Plasma, Unity und Cinnamon, bieten irgendeine Möglichkeit, um Hotkeys oder eigene Tastenkürzel zu definieren – besondere Tastenverbindungen, die Befehle starten oder andere Operationen ausführen. Ich empfehle Ihnen unbedingt, sich Tastenkombinationen für diese häufig durchgeführten Operationen zu definieren:
Wenn Sie diese Tastenkürzel definiert haben, können Sie jederzeit im Handumdrehen ein Terminal oder einen Browser öffnen, ganz egal, in welcher Anwendung Sie gerade stecken.1 Um das einzurichten, müssen Sie Folgendes wissen:
Den Befehl, der Ihr bevorzugtes Terminalprogramm startet
Beliebt sind unter anderem gnome-terminal, konsole und xterm.
Den Befehl, der Ihren bevorzugten Browser startet
Beliebt sind unter anderem firefox, google-chrome und opera.
Wie Sie ein eigenes Tastenkürzel definieren
Die Anweisungen hängen von der jeweiligen Desktopumgebung ab und können sich von Version zu Version unterscheiden. Suchen Sie am besten im Web nach Ihrer passenden Variante. Geben Sie bei der Suche den Namen Ihrer Desktopumgebung, gefolgt von »define keyboard shortcut«, »Tastenkürzel definieren« oder etwas Vergleichbarem an.
Auf meinem Desktop weise ich das Tastenkürzel Strg-Windows-T zu, um konsole, und Strg-Windows-C, um google-chrome auszuführen.
![]() |
Arbeitsverzeichnisse Wenn Sie in Ihrer Desktopumgebung eine Shell über ein Tastenkürzel starten, dann ist diese ein Kind Ihrer Login-Shell. Ihr aktuelles Verzeichnis ist Ihr Home-Verzeichnis (es sei denn, Sie haben die Shell irgendwie auf etwas anderes konfiguriert). Vergleichen Sie das mit dem Öffnen einer neuen Shell aus Ihrem Terminalprogramm heraus – indem Sie explizit (zum Beispiel) gnome-terminal oder xterm auf der Kommandozeile ausführen oder das Menü Ihres Terminalprogramms verwenden, um ein neues Fenster zu öffnen. In diesem Fall ist die neue Shell ein Kind der Shell dieses Terminals. Ihr aktuelles Verzeichnis ist identisch mit dem ihres Elternprozesses, und das muss nicht unbedingt Ihr Home-Verzeichnis sein. |
Angenommen, Sie sind gerade dabei, mehrere Anwendungen zu benutzen, als Sie plötzlich den Bedarf nach einer Shell verspüren, um einen Befehl auszuführen. Viele Benutzer würden sich die Maus schnappen und unter ihren offenen Fenstern nach einem laufenden Terminal suchen. Machen Sie das nicht – Sie verschwenden damit nur Zeit. Öffnen Sie stattdessen mit Ihrem Hotkey ein neues Terminalfenster, führen Sie Ihren Befehl aus und beenden Sie das Terminal im Anschluss gleich wieder.
Sobald Sie Hotkeys für den Start von Terminalprogrammen und Browserfenstern zugewiesen haben, können Sie diese Fenster völlig ungehemmt und in großer Zahl öffnen und schließen. Ich rate Ihnen sogar dazu! Erzeugen und zerstören Sie Terminals und Browserfenster regelmäßig, anstatt sie über einen langen Zeitraum geöffnet zu lassen. Ich bezeichne diese kurzlebigen Fenster als Einmalfenster. Sie öffnen sie schnell, benutzen sie für einige Augenblicke und schließen sie dann wieder.
Sie könnten einige Shells lange geöffnet lassen, falls Sie Software entwickeln oder andere langwierige Arbeiten erledigen, aber Einmalterminalfenster sind perfekt für alle anderen gelegentlichen Arbeiten, die Sie im Laufe eines Tages verrichten. Oft geht es schneller, ein neues Terminal zu öffnen, als auf Ihrem Bildschirm nach einem bestehenden Terminal zu suchen. Fragen Sie sich nicht: »Wo ist das Terminalfenster, das ich brauche?« Durchsuchen Sie nicht mühselig den Bildschirm danach. Starten Sie einfach ein neues und beenden Sie es, wenn es seinen Zweck erfüllt hat.
Das gilt auch für Webbrowserfenster. Haben Sie schon einmal nach einem langen Tag des Linux-Hackens entdeckt, dass Ihr Browser nur ein Fenster, aber dafür 83 geöffnete Tabs hat? Das ist ein Zeichen dafür, dass Sie zu wenige Einmalfenster benutzen. Öffnen Sie eines, schauen Sie sich die Webseite an, die Sie besuchen wollten, und schließen Sie es wieder. Sie müssen später noch einmal auf diese Seite? Suchen Sie sie in der Browser-History.
Da wir schon einmal beim Thema der Browserfenster sind, sollten Sie sich vergewissern, dass Sie die wichtigsten Tastenkürzel aus Tabelle 10-1 kennen. Wenn Ihre Hände bereits auf der Tastatur liegen und Sie zu einer neuen Website gehen wollen, ist es oft schneller, Strg-L zu drücken, um in die Adressleiste zu springen, oder Strg-T, um einen Tab zu öffnen, als zu zeigen und zu klicken.
Tabelle 10-1: Die wichtigsten Tastenkürzel für Firefox, Google Chrome und Opera
Aktion |
Tastenkürzel |
Neues Fenster öffnen |
Strg-N |
Neues privates oder Inkognito-Fenster öffnen |
Strg-Umschalt-P (Firefox), Strg-Umschalt-N (Chrome und Opera) |
Neuen Tab öffnen |
Strg-T |
Tab schließen |
Strg-W |
Durch die Browsertabs blättern |
Strg-Tab (blättert vorwärts) und Strg-Umschalt-Tab (blättert rückwärts) |
In die Adressleiste springen |
Strg-L (oder Alt-D oder F6) |
Auf der aktuellen Seite nach Text suchen |
Strg-F |
Browser-History anzeigen |
Strg-H |
Wie finden Sie schnell ein gewünschtes Fenster, wenn Ihr Desktop schier verstopft ist mit Fenstern? Sie könnten sich durch das Chaos hindurchklicken, aber oft geht es schneller, das Tastenkürzel Alt-Tab zu benutzen. Drücken Sie immer wieder Alt-Tab, und Sie blättern nacheinander durch alle Fenster auf dem Desktop. Wenn Sie das gewünschte Fenster erreicht haben, lassen Sie die Tasten los. Das Fenster ist nun im Fokus und kann benutzt werden. Um in umgekehrter Richtung zu blättern, drücken Sie Alt-Umschalt-Tab.
Um durch alle Fenster auf dem Desktop zu blättern, die zur selben Anwendung gehören, also etwa durch alle Firefox-Fenster, drücken Sie Alt-` (Alt-Backquote oder Alt plus die Taste über der Tab-Taste). Zum Rückwärtsblättern drücken Sie zusätzlich die Umschalt-Taste (Alt-Umschalt-Backquote).
Nachdem Sie nun Fenster wechseln können, wollen wir über das Wechseln von Desktops sprechen. Falls Sie ernsthaft auf Linux arbeiten und nur einen Desktop verwenden, verpassen Sie eine großartige Gelegenheit, Ihre Arbeit zu organisieren. Mehrere Desktops, auch Workspaces oder virtuelle Desktops genannt, sind genau das, wonach sie klingen. Statt eines einzigen Desktops könnten Sie vier oder sechs oder mehr haben – jeweils mit eigenen Fenstern –, und Sie können zwischen ihnen umschalten.
Auf meiner Workstation, auf der Ubuntu Linux mit KDE Plasma läuft, führe ich sechs virtuelle Desktops aus, denen ich unterschiedliche Aufgaben zugewiesen habe. Desktop #1 ist mein Hauptarbeitsbereich mit E-Mail und Browser, #2 dient familienbezogenen Aufgaben, in #3 betreibe ich virtuelle Maschinen mit VMware, in #4 schreibe ich Bücher wie dieses hier, und #5 bis #6 sind für alle spontan anfallenden Aufgaben. Diese konsistenten Zuweisungen erlauben es mir, schnell und einfach meine offenen Fenster aus den unterschiedlichen Anwendungen zu finden.
Jede Linux-Desktopumgebung, wie GNOME, KDE Plasma, Cinnamon und Unity, besitzt ihre eigene Methode, um virtuelle Desktops umzusetzen. Und alle bieten einen grafischen »Umschalter« oder »Pager« zum Wechseln zwischen den Desktops. Ich empfehle Ihnen, Tastenkürzel in Ihrer Desktopumgebung zu definieren, um schnell zum gewünschten Desktop zu springen. Auf meinem Computer habe ich Windows-F1 bis Windows-F6 definiert, um schnell zu den Desktops #1 bis #6 zu springen.
Es gibt noch viele andere Stile zum Arbeiten mit Desktops und Fenstern. Manche Menschen benutzen einen Desktop pro Anwendung: einen Desktop für Shells, einen zum Surfen im Web, einen für die Textverarbeitung und so weiter. Andere User mit kleinen Laptop-Bildschirmen öffnen nur ein allerdings bildschirmfüllendes Fenster auf jedem Desktop statt mehrerer Fenster pro Desktop. Finden Sie für sich einen Stil, der funktioniert. Hauptsache, er ist schnell und effizient.
Browser zum Zeigen und Klicken sind fast schon synonym mit dem Web, dabei können Sie auf Websites auch von der Linux-Kommandozeile wirksam zugreifen.
Sie sind es vermutlich gewohnt, einen Webbrowser zu starten, indem Sie ein Icon anklicken oder antippen, dabei können Sie das auch von der Linux-Kommandozeile aus erledigen. Falls der Browser noch nicht läuft, setzen Sie ein Ampersand-Zeichen hinter den Befehl, um ihn im Hintergrund auszuführen und Ihren Shell-Prompt zurückzuerhalten:
$ firefox &
$ google-chrome &
$ opera &
Läuft ein bestimmter Browser bereits, lassen Sie das Ampersand-Zeichen weg. Der Befehl weist eine existierende Browserinstanz an, ein neues Fenster oder einen neuen Tab zu öffnen. Der Befehl beendet sich dann sofort und gibt Ihnen den Shell-Prompt zurück.
![]() |
Tipp Ein in den Hintergrund geschobener Befehl gibt möglicherweise Diagnosemeldungen aus und verstopft damit Ihr Shell-Fenster. Um das zu vermeiden, leiten Sie alle Ausgaben nach/dev/null um, wenn Sie den Browser das erste Mal starten, zum Beispiel: $ firefox &> /dev/null & |
Um von der Kommandozeile aus einen Browser zu öffnen und eine URL zu besuchen, geben Sie die URL als Argument an:
$ firefox https://oreilly.com
$ google-chrome https://oreilly.com
$ opera https://oreilly.com
Die gerade gezeigten Befehle öffnen standardmäßig einen neuen Tab und bringen diesen in den Fokus. Um sie zu zwingen, stattdessen ein neues Fenster zu öffnen, fügen Sie eine Option hinzu:
$ firefox --new-window https://oreilly.com
$ google-chrome --new-window https://oreilly.com
$ opera --new-window https://oreilly.com
Um ein privates oder ein Inkognito-Browserfenster zu öffnen, fügen Sie die entsprechende Kommandozeilenoption hinzu:
$ firefox --private-window https://oreilly.com
$ google-chrome --incognito https://oreilly.com
$ opera --private https://oreilly.com
Diese Befehle scheinen eine Menge Aufwand und Tipparbeit zu bedeuten, doch Sie können sie effizient einsetzen, indem Sie Aliase für Sites einrichten, die Sie häufig besuchen:
# Setzen Sie dies in eine Shell-Konfigurationsdatei und laden Sie diese: alias oreilly="firefox --new-window https://oreilly.com"
Falls Sie eine Datei haben, die eine URL enthält, für die Sie sich interessieren, extrahieren Sie diese URL mit grep, cut oder anderen Linux-Befehlen und übergeben sie mittels einer Befehlssubstitution auf der Kommandozeile an den Browser. Hier ist ein Beispiel mit einer durch Tabulatoren separierten Datei mit zwei Spalten:
$ cat urls.txt
duckduckgo.com Meine Suchmaschine
nytimes.com Meine Zeitung
spotify.com Meine Musik
$ grep Musik urls.txt | cut -f1
spotify.com
$ google-chrome https://$(grep Musik urls.txt | cut -f1) Spotify besuchen
Oder nehmen wir an, dass Sie Pakete, die Sie erwarten, mit einer Datei aus Tracking- oder Sendungsverfolgungsnummern im Auge behalten:
$ cat packages.txt
1Z0EW7360669374701 UPS Schuhe
568733462924 FedEx Küchenmixer
9305510823011761842873 USPS Carepaket von Mama
Das Shell-Skript in Beispiel 10-1 öffnet die Tracking-Seiten der entsprechenden Paketdienste (UPS, FedEx oder US Postal Service), indem es die Tracking-Nummern an die jeweiligen URLs anhängt.
Beispiel 10-1: track-it-Skript, das die Tracking-Seite der Paketdienste aufruft
#!/bin/bash
PROGRAM=$(basename $0)
DATAFILE=packages.txt
# Wählen Sie einen Browserbefehl: firefox, opera, google-chrome
BROWSER="opera"
errors=0
cat "$DATAFILE" | while read line; do
track=$(echo "$line" | awk '{print $1}')
service=$(echo "$line" | awk '{print $2}')
case "$service" in
UPS)
$BROWSER "https://www.ups.com/track?tracknum=$track" &
;;
FedEx)
$BROWSER "https://www.fedex.com/fedextrack/?trknbr=$track" &
;;
USPS)
$BROWSER "https://tools.usps.com/go/TrackConfirmAction?tLabels=$track" &
;;
*)
>&2 echo "$PROGRAM: Unbekannter Dienst '$service'"
errors=1
;;
esac
done
exit $errors
Webbrowser sind nicht die einzigen Linux-Programme, die Websites besuchen. Die Programme curl und wget können Webseiten und andere Webinhalte mit einem einzigen Befehl herunterladen, ohne dass Sie einen Browser anrühren. Standardmäßig gibt curl seine Ausgabe auf der Standardausgabe aus, während wget seine Ausgabe in einer Datei speichert (nachdem es eine Menge diagnostischer Meldungen ausgegeben hat):
$ curl https://efficientlinux.com/welcome.html
Welcome to Efficient Linux.com!
$ wget https://efficientlinux.com/welcome.html
--2021-10-27 20:05:47-- https://efficientlinux.com/
Resolving efficientlinux.com (efficientlinux.com)...
Connecting to efficientlinux.com (efficientlinux.com)...
...
2021-10-27 20:05:47 (12.8 MB/s) - ‘welcome.html’ saved [32/32]
$ cat welcome.html
Welcome to Efficient Linux.com!
![]() |
Tipp Manche Sites unterstützen die Abfrage durch wget und curl nicht. Beide Befehle können sich in solchen Fällen als Browser ausgeben. Weisen Sie das jeweilige Programm einfach an, seinen User Agent zu ändern – den String, der einen Webclient an einem Webserver identifiziert. Ein geeigneter User Agent ist Mozilla: $ wget -U Mozilla url $ curl -A Mozilla url |
Sowohl wget als auch curl haben eine Unmenge an Optionen und Eigenschaften, die Sie auf ihren Manpages entdecken können. Im Moment wollen wir uns nur anschauen, wie Sie diese Befehle in freche Einzeiler einbauen. Stellen Sie sich vor, die Website efficientlinux.com besitzt ein Verzeichnis images, das die Dateien1.jpg bis 20.jpg enthält. Sie würden diese gern herunterladen. Ihre URLs sind:
https://efficientlinux.com/images/1.jpg
https://efficientlinux.com/images/2.jpg
https://efficientlinux.com/images/3.jpg
...
Eine ineffiziente Methode wäre es, jede einzelne URL im Webbrowser zu besuchen und die Bilder nacheinander herunterzuladen. (Melden Sie sich, falls Sie das schon einmal gemacht haben!) Besser ist es, wget einzusetzen. Generieren Sie die URLs mit seq und awk:
$ seq 1 20 | awk '{print "https://efficientlinux.com/images/" $1 ".jpg"}'
https://efficientlinux.com/images/1.jpg
https://efficientlinux.com/images/2.jpg
https://efficientlinux.com/images/3.jpg
...
Fügen Sie dann den String wget in das awk-Programm ein und schicken Sie die resultierenden Befehle in einer Pipeline zur Ausführung an die bash:
$ seq 1 20 \
| awk '{print "wget https://efficientlinux.com/images/" $1 ".jpg"}' \
| bash
Benutzen Sie alternativ xargs zum Erzeugen und Ausführen der wget-Befehle:
$ seq 1 20 | xargs -I@ wget https://efficientlinux.com/images/@.jpg
Die xargs-Lösung ist überlegen, falls Ihre wget-Befehle Sonderzeichen enthalten. Die »Pipe an bash«-Lösung würde die Shell veranlassen, diese Zeichen auszuwerten (was Sie nicht wollen), während xargs das nicht tut.
Mein Beispiel war ein bisschen gestellt, weil die Bilddateinamen so einförmig sind. In einem realistischeren Beispiel könnten Sie alle Bilder von einer Webseite herunterladen, indem Sie die Seite mit curl abrufen, sie in einer Pipeline durch eine schlaue Abfolge von Befehlen leiten, um die Bild-URLs – jeweils eine pro Zeile – zu isolieren, und dann eine der gerade gezeigten Techniken darauf anwenden:
curl URL | ... schlaue Pipeline hier... | xargs -n1 wget
Falls Sie sich ein bisschen mit HTML und CSS auskennen, können Sie die HTML-Quelle von Webseiten von der Kommandozeile aus parsen. Das ist manchmal effizienter, als Teile einer Webseite von Hand aus einem Browserfenster auszuschneiden und irgendwo einzusetzen. Eine praktische Sammlung von Werkzeugen für diesen Zweck ist HTML-XML-utils, das in vielen Linux-Distributionen sowie beim World Wide Web Consortium (https://oreil.ly/81yM2) zur Verfügung steht. Ein allgemeines Rezept lautet:
Erweitern wir unser Beispiel aus »Eine Vorwahldatenbank bauen« auf Seite 180, um Vorwahldaten aus dem Web zu holen und die Datei areacodes.txt zu erstellen, die in diesem Beispiel benutzt wurde. Für Ihre Bequemlichkeit habe ich eine HTML-Tabelle mit Vorwahlen erzeugt, die Sie herunterladen und verarbeiten können. Sie sehen sie in Abbildung 10-1.
Abbildung 10-1: Eine Tabelle mit Vorwahlen unter https://efficientlinux.com/areacodes.html
Erfassen Sie zuerst die HTML-Quelle mit curl, wobei Sie zugleich die Option -s einsetzen, um Bildschirmmeldungen zu unterdrücken. Leiten Sie die Ausgabe in einer Pipeline an hxnormalize -x, um sie ein bisschen zu bereinigen. Leiten Sie sie dann in einer Pipeline an less, sodass Sie sie bildschirmweise anschauen können:
$ curl -s https://efficientlinux.com/areacodes.html \
| hxnormalize -x \
| less
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
...
<body>
<h1>Area code test</h1>
...
Die HTML-Tabelle auf dieser Seite, die in Beispiel 10-2 gezeigt wird, hat die CSS-ID #ac, und ihre drei Spalten (Vorwahl, Staat und Ort) nutzen die CSS-Klassen ac, state bzw. cities.
Beispiel 10-2: Teile aus dem HTML-Quellcode der Tabelle in Abbildung 10-1
<table id="ac">
<thead>
<tr>
<th>Vorwahl</th>
<th>Staat</th>
<th>Ort</th>
</tr>
</thead>
<tbody>
<tr>
<td class="ac">201</td>
<td class="cities">Hackensack, Jersey City</td>
</tr>
...
</tbody>
</table>
Führen Sie hxselect aus, um die Vorwahldaten aus den einzelnen Tabellenzellen zu extrahieren. Die Option -c sorgt dafür, dass die td-Tags in der Ausgabe weggelassen werden. Geben Sie die Ergebnisse in einer langen Zeile aus, wobei Sie die Felder mit einem Zeichen Ihrer Wahl trennen (mithilfe der Option -s.2) Ich habe mich für das Zeichen @ entschieden, weil es auf der Seite gut sichtbar ist:
$ curl -s https://efficientlinux.com/areacodes.html \
| hxnormalize -x \
| hxselect -c -s@ '#ac .ac, #ac .state, #ac .cities'
201@NJ@Hackensack, Jersey City@202@DC@Washington@203@CT@New Haven, Stamford@...
Leiten Sie die Ausgabe schließlich mit einer Pipeline an sed, um diese lange Zeile in drei durch Tabulatoren getrennte Spalten zu verwandeln. Schreiben Sie einen regulären Ausdruck, der die folgenden Strings erfasst:
Kombinieren Sie die Teile zu diesem regulären Ausdruck:
[0-9]*@[A-Z][A-Z]@[^@]*@
Erfassen Sie die Vorwahl, den Bundesstaat und die Städte als Subausdrücke, indem Sie sie mit \( und \) umgeben. Sie haben nun einen vollständigen regulären Ausdruck für sed:
\([0-9]*\)@\([A-Z][A-Z]\)@\([^@]*\)@
Für den sed-Ersetzungsstring geben Sie die drei Subausdrücke an, getrennt durch Tabs und beendet durch Newlines, wodurch das Format der Datei areacodes.txt entsteht:
\1\t\2\t\3\n
Kombinieren Sie den gezeigten regulären Ausdruck sowie den Ersetzungsstring und erstellen Sie damit dieses sed-Skript:
s/\([0-9]*\)@\([A-Z][A-Z]\)@\([^@]*\)@/\1\t\2\t\3\n/g
Der fertige Befehl erzeugt die erforderlichen Daten für die Datei areacodes.txt:
$ curl -s https://efficientlinux.com/areacodes.html \
| hxnormalize -x \
| hxselect -c -s'@' '#ac .ac, #ac .state, #ac .cities' \
| sed 's/\([0-9]*\)@\([A-Z][A-Z]\)@\([^@]*\)@/\1\t\2\t\3\n/g'
201 NJ Hackensack, Jersey City
202 DC Washington
203 CT New Haven, Stamford
...
Der Umgang mit langen regulären Ausdrücken
Falls Ihre sed-Skripte so lang werden, dass sie nur noch wie ein Haufen wirrer Zeichen aussehen:
s/\([0-9]*\)@\([A-Z][A-Z]\)@\([^@]*\)@/\1\t\2\t\3\n/g
versuchen Sie, diese aufzuteilen. Speichern Sie Teile des regulären Ausdrucks in mehreren Shell-Variablen und kombinieren Sie die Variablen später, wie in diesem folgenden Shell-Skript:
# Die drei Teile des regulären Ausdrucks.
# Benutzen Sie einfache Anführungszeichen, um eine Auswertung
# durch die Shell zu verhindern.
areacode='\([0-9]*\)'
state='\([A-Z][A-Z]\)'
cities='\([^@]*\)'
# Kombinieren Sie die drei Teile, getrennt durch @-Symbole.
# Verwenden Sie doppelte Anführungszeichen, um eine
# Variablenauswertung durch die Shell zu erlauben.
regexp="$areacode@$state@$cities@"
# Der Ersetzungsstring.
# Verwenden Sie einfache Anführungszeichen, um eine Auswertung
# durch die Shell zu verhindern.
replacement='\1\t\2\t\3\n'
# Das sed-Skript ist nun viel einfacher zu lesen:
# s/$regexp/$replacement/g
# Führen Sie den kompletten Befehl aus:
curl -s https://efficientlinux.com/areacodes.html \
| hxnormalize -x \
| hxselect -c -s'@' '#ac .ac, #ac .state, #ac .cities' \
| sed "s/$regexp/$replacement/g"
Wenn Sie von der Kommandozeile aus Daten aus dem Web abrufen, wollen Sie manchmal nicht die HTML-Quelle einer Webseite, sondern die gerenderte Version der Seite als Text. Es könnte ja sein, dass der gerenderte Text einfacher zu analysieren ist. Um diese Aufgabe zu erledigen, benutzen Sie einen textbasierten Browser wie lynx oder links. Textbasierte Browser zeigen Webseiten in einem vereinfachten Format ohne Bilder oder andere aufwendige Elemente an. Abbildung 10-2 stellt die Vorwahlseite aus dem vorherigen Abschnitt in lynx dar.
Abbildung 10-2: lynx-Darstellung der Seite https://efficientlinux.com/areacodes.html
Sowohl lynx als auch links laden eine gerenderte Seite mit der Option -dump herunter. Benutzen Sie das Programm, das Sie bevorzugen.
$ lynx -dump https://efficientlinux.com/areacodes.html > tempfile
$ cat tempfile
Area code test
Area code State Location
201 NJ Hackensack, Jersey City
202 DC Washington
203 CT New Haven, Stamford
...
![]() |
Tipp lynx und links eignen sich auch gut, um einen verdächtig aussehenden Link zu überprüfen, wenn Sie nicht sicher sind, ob er rechtmäßig oder bösartig ist. Diese textbasierten Browser unterstützen kein JavaScript und rendern auch keine Bilder, sie sind also weniger anfällig für Angriffe. (Sie können natürlich keine komplette Sicherheit versprechen, schalten Sie daher Ihren gesunden Menschenverstand nicht ab.) |
Jede moderne Softwareanwendung mit einem Bearbeiten-Menü enthält die Operationen Ausschneiden, Kopieren und Einfügen, um Inhalte in die Systemzwischenablage hinein- und wieder aus ihr herauszubefördern. Vermutlich kennen Sie auch die Tastenkürzel für diese Operationen. Aber wussten Sie, dass Sie die Zwischenablage direkt von der Kommandozeile aus bedienen können?
Zuerst ein bisschen Hintergrund: Kopier- und Einfügeoperationen unter Linux sind Teil eines allgemeineren Mechanismus, der als X-Auswahlen bezeichnet wird. Eine Auswahl ist ein Ziel für kopierten Inhalt, wie etwa die Systemzwischenablage. »X« ist ganz einfach der Name der Linux-Fenstersoftware. Die meisten Linux-Desktopumgebungen, die auf X aufbauen, wie etwa GNOME, Unity, Cinnamon und KDE Plasma, unterstützen zwei Auswahlen.3 Die erste ist die Zwischenablage, oder das Clipboard, die genauso funktioniert wie die Zwischenablagen in anderen Betriebssystemen. Wenn Sie Ausschneide- oder Kopieroperationen in einer Anwendung durchführen, landet der Inhalt in der Zwischenablage. Sie holen ihn mit einer Einfügeoperation wieder zurück. Eine weniger bekannte X-Auswahl ist die primäre Auswahl. Wenn Sie in bestimmten Anwendungen Text auswählen, wird er in die primäre Auswahl geschrieben, selbst wenn Sie keine Kopieroperation durchführen. Ein Beispiel ist das Hervorheben von Text in einem Terminalfenster mit der Maus. Dieser Text wird automatisch in die primäre Auswahl geschrieben.
![]() |
Hinweis Falls Sie über SSH oder ähnliche Programme eine Verbindung zu einem entfernten Linux-Host aufnehmen, wird das Kopieren und Einfügen im Allgemeinen vom lokalen Computer erledigt, nicht von den X-Auswahlen auf dem entfernten Linux-Host. |
Tabelle 10-2 listet Maus- und Tastaturoperationen zum Zugriff auf die X-Auswahlen in GNOMEs Terminal (gnome-terminal) und KDEs Konsole (konsole) auf. Falls Sie ein anderes Terminalprogramm verwenden, suchen Sie im Bearbeiten-Menü nach den Tastaturäquivalenten für Kopieren und Einfügen.
Tabelle 10-2: In verbreiteten Terminalprogrammen auf X-Auswahlen zugreifen
Operation |
Zwischenablage |
Primäre Auswahl |
Kopieren (Maus) |
Öffnen des rechten Maustastenmenüs und Auswahl von Kopieren |
Klicken und ziehen oder doppelklicken, um das aktuelle Wort, bzw. dreifach klicken, um die aktuelle Zeile auszuwählen |
Einfügen (Maus) |
Öffnen des rechten Maustastenmenüs und Auswahl von Einfügen |
Drücken der mittleren Maustaste (normalerweise das Scrollrad) |
Kopieren (Tastatur) |
Strg-Umschalt-C |
n/a |
Strg-Umschalt-V oder Strg-Umschalt-Einfg |
Umschalt-Einfg |
|
Einfügen (Tastatur), konsole |
Strg-Umschalt-V oder Umschalt-Einfg |
Strg-Umschalt-Einfg |
Linux bietet den Befehl xclip, um X-Auswahlen mit der Standardeingabe und der Standardausgabe zu verbinden. Sie können deshalb Kopier- und Einfügeoperationen in Pipelines und andere kombinierte Befehle einsetzen. Sie haben zum Beispiel Text folgendermaßen in eine Anwendung kopiert:
Mit xclip können Sie diesen Vorgang deutlich abkürzen:
Umgekehrt haben Sie vermutlich Text mit solchen Linux-Befehlen zur Weiterverarbeitung in eine Datei eingefügt:
Mit xclip -o können Sie die zwischengeschaltete Textdatei weglassen:
![]() |
Warnung Falls Sie das Buch digital auf einem Linux-Gerät lesen und einige der xclip-Befehle aus diesem Abschnitt ausprobieren wollen, dann versuchen Sie nicht, diese Befehle zu kopieren und in ein Shell-Fenster einzufügen. Tippen Sie die Befehle von Hand ab. Wieso? Weil Ihre Kopieroperation die gleiche X-Auswahl überschreiben könnte, auf die die Befehle mit xclip zugreifen, wodurch die Befehle unerwartete Ergebnisse erzeugen könnten. |
Standardmäßig liest xclip die Standardeingabe und schreibt die primäre Auswahl. Es kann aus einer Datei lesen:
$ xclip < myfile.txt
oder aus einer Pipeline:
$ echo "Efficient Linux at the Command Line" | xclip
Geben Sie nun den Text auf der Standardausgabe aus oder leiten Sie den Auswahlinhalt an andere Befehle weiter, wie etwa wc:
$ xclip -o Einfügen auf Standardausgabe
Efficient Linux at the Command Line
$ xclip -o > anotherfile.txt Einfügen in eine andere Datei
$ xclip -o | wc -w Wörter zählen
6
Jeder kombinierte Befehl, der auf die Standardausgabe schreibt, kann seine Ergebnisse mit einer Pipeline an xclip leiten, wie dieser hier aus »Befehl #6: uniq« auf Seite 31:
$ cut -f1 grades | sort | uniq -c | sort -nr | head -n1 | cut -c9 | xclip
Löschen Sie die primäre Auswahl, indem Sie ihren Wert mit echo -n auf den leeren String setzen:
$ echo -n | xclip
Die Option -n ist wichtig, da echo ansonsten ein Newline-Zeichen auf der Standardausgabe ausgibt, das in der primären Auswahl landet.
Um Text in die Zwischenablage statt in die primäre Auswahl zu kopieren, führen Sie xclip mit der Option -selection clipboard aus:
$ echo https://oreilly.com | xclip -selection clipboard Kopieren
$ xclip -selection clipboard -o Einfügen
https://oreilly.com
xclip-Optionen können abgekürzt werden, solange sie eindeutig sind:
$ xclip -sel c -o identisch mit xclip -selection clipboard -o
https://oreilly.com
Starten Sie ein Firefox-Browserfenster, um die gezeigte URL zu besuchen, und verwenden Sie dabei eine Befehlssubstitution:
$ firefox $(xclip -selection clipboard -o)
Linux bietet einen weiteren Befehl, nämlich xsel, der ebenfalls X-Auswahlen liest und schreibt. Dieser besitzt einige zusätzliche Eigenarten, wie das Löschen einer Auswahl (xsel -c) und das Anhängen an eine Auswahl (xsel -a). Lesen Sie einfach in der Manpage nach und experimentieren Sie mit xsel.
Nutzen wir unser neu gewonnenes Wissen über xclip, um X-Auswahlen in den Passwortmanager pman aus »Einen Passwortmanager bauen« auf Seite 183 zu integrieren. Wenn das modifizierte pman-Skript eine Zeile aus der Datei vault.gpg herausfiltert, schreibt es den Benutzernamen in die Zwischenablage und das Passwort in die primäre Auswahl. Anschließend können Sie zum Beispiel eine Login-Seite im Web ausfüllen, indem Sie den Benutzernamen mit Strg-V und das Passwort mit der mittleren Maustaste einfügen.
![]() |
Warnung Stellen Sie sicher, dass Sie keinen Clipboard-Manager oder andere Anwendungen betreiben, die Ihre X-Auswahlen und deren Inhalte überwachen. Benutzernamen und/oder Passwörter würden dann nämlich im Clipboard-Manager sichtbar werden, was ein Sicherheitsrisiko darstellt. |
Die neue Version von pman befindet sich in Beispiel 10-3. Das Verhalten von pman hat sich auf folgende Weise geändert:
Beispiel 10-3: Ein verbessertes pman-Skript, das den Benutzernamen und das Passwort als Auswahlen lädt
#!/bin/bash
PROGRAM=$(basename $0)
DATABASE=$HOME/etc/vault.gpg
load_password () {
# Setzt den Benutzernamen (Feld 1) in die Zwischenablage.
echo "$1" | cut -f1 | tr -d '\n' | xclip -selection clipboard
# Setzt das Passwort (Feld 2) in die primäre Auswahl.
echo "$1" | cut -f2 | tr -d '\n' | xclip -selection primary
# Liefert dem Benutzer eine Rückmeldung.
echo "$PROGRAM: Gefunden" $(echo "$1" | cut -f3- --output-delimiter ': ')
echo "$PROGRAM: Benutzername und Passwort in X-Auswahlen geladen"
}
if [ $# -ne 1 ]; then
>&2 echo "$PROGRAM: sucht nach Passwörtern"
>&2 echo "Verwendung: $PROGRAM String"
fi
searchstring="$1"
# Speichert den entschlüsselten Text in einer Variablen.
decrypted=$(gpg -d -q "$DATABASE")
if [ $? -ne 0 ]; then
>&2 echo "$PROGRAM: konnte $DATABASE nicht entschlüsseln"
exit 1
fi
# Sucht nach exakten Treffern in der dritten Spalte.
match=$(echo "$decrypted" | awk '$3~/^'$searchstring'$/')
if [ -n "$match" ]; then
load_password "$match"
exit $?
fi
# Sucht nach irgendeinem Treffer.
match=$(echo "$decrypted" | awk "/$searchstring/")
if [ -z "$match" ]; then
>&2 echo "$PROGRAM: keine Treffer"
exit 1
fi
# Zählt die Treffer.
count=$(echo "$match" | wc -l)
case "$count" in
0)
>&2 echo "$PROGRAM: keine Treffer"
exit 1
;;
1)
load_password "$match"
exit $?
;;
*)
>&2 echo "$PROGRAM: mehrere Treffer für die folgenden Schlüssel:"
echo "$match" | cut -f3
>&2 echo "$PROGRAM: Skript noch einmal mit einem der Schlüssel ausführen"
exit
;;
esac
Führen Sie das Skript aus:
$ pman dropbox
Passphrase: xxxxxxxx
pman: Gefunden dropbox: dropbox.com account for work
pman: Benutzername und Passwort in X-Auswahlen geladen
$ pman account
Passphrase: xxxxxxxx
pman: mehrere Treffer für die folgenden Schlüssel:
bank
dropbox2
pman: Skript noch einmal mit einem der Schlüssel ausführen
Die Passwörter bleiben so lange in der primären Auswahl, bis diese überschrieben wird. Um die Passwörter automatisch nach, sagen wir, 30 Sekunden zu löschen, hängen Sie die folgende Zeile an die Funktion load_password an. Die Zeile startet im Hintergrund eine Subshell, die 30 Sekunden wartet und dann die primäre Auswahl löscht (indem sie sie auf den leeren String setzt). Sie können natürlich statt der Zahl 30 auch etwas anderes angeben.
(sleep 30 && echo -n | xclip -selection primary) &
Hatten Sie in »Instant-Shells und Browser« auf Seite 193 ein eigenes Tastenkürzel definiert, um Terminalfenster zu starten, haben Sie nun eine schnelle Möglichkeit, um auf Ihre Passwörter zuzugreifen. Starten Sie mit dem Hotkey ein Terminal, führen Sie pman aus und schließen Sie das Terminal wieder.
Ich hoffe, dieses Kapitel hat Sie ermutigt, einige neue Techniken auszuprobieren, mit denen Sie Ihre Hände an der Tastatur behalten. Sie scheinen zu Anfang recht aufwendig zu sein, aber mit ein wenig Übung gehen sie Ihnen in Fleisch und Blut über, und Sie werden sie schnell und automatisch einsetzen. Schon bald werden Sie den Neid Ihrer Linux-Freunde spüren, wenn Sie flink und geschmeidig Desktopfenster, Webinhalte und X-Auswahlen auf eine Weise manipulieren, die die mausgebundenen Massen nicht beherrschen.