Globenaut

Jeder hat das Recht auf Meinungsfreiheit und freie Meinungsäußerung; dieses Recht schließt die Freiheit ein, Meinungen ungehindert anzuhängen sowie über Medien jeder Art und ohne Rücksicht auf Grenzen Informationen und Gedankengut zu suchen, zu empfangen und zu verbreiten.
Die Allgemeine Erklärung der Menschenrechte
Resolution 217 A (III) vom 10.12.1948/Artikel 19
Zensoren sind Verbrecher!
BPjM: Trusted Censorship
Christliche Werte — Neine Danke!

Skripttipp #7: Datenaustausch zwischen Zwischenablage und Terminal

von Globenaut am 21.7.09

Der erste Teil beschreibt das Verfahren für MacOS X, weiter unten folgen dann Hinweise für Linux.

Besonders hilfreich sind die nachfolgend beschriebenen Funktionen beim Schreiben von Dokumentationen (bspw. Verzeichnislisten, Dateiinhalte) zur Weiterverabritung von Suchergebnissen oder auch mal zur Übertragung eines längeren Passwortes ohne Intermediärdatei.

MacOS X

Mac-Benutzer sind es seit den Anfängen gewohnt mittels Einfügen und Einsetzen Daten über die Zwischenablage zwischen Programmen auszutauschen. Seit MacOS X hat auch das klassische UNIX-Terminal Einzug gehalten, mit dem auch dann und wann Daten von Programmen der grafischen Oberfläche ausgetauscht werden sollen. Die beiden klassischen Wege über Kopieren und Einsetzten bzw. Drag & Drop funktionieren wie gewohnt, aber es gibt noch eine dritte Möglichkeit, die mehr Funktionalität bietet und oft auch schneller ist. Daher heute ein paar Tipps zu einem meinem Eindruck nach wenig bekannten, aber äußerst nützlichen Befehlspaar unter MacOS X: pbpaste und pbcopy.[1] Sie sind Bestandteil von MacOS X, daher ist keinerlei Installation notwendig. Mittels dieser beiden Terminalprogramme kann man Daten vom Terminal direkt in die Zwischenablage (pbcopy) bzw. aus der Zwischenablage (pbpaste) in das Terminal — genauer nach stdin — schreiben:

#:~>cat Test.txt | pbcopy
#:~>

Alternativ läßt sich auch mit der Ausgabeumleitung arbeiten:

#:~>pbcopy < Test.txt
#:~>

Eine Kopie des Inhaltes der Datei Test.txt befindet sich jetzt in der Zwischenablage. Dies ist deutlich schneller als das Aktivieren der Ausgabe im Terminalfenster oder das Anlegen einer temporären Datei und Öffnen dieser im Programm der grafischen Oberfläche (sofern sich dort überhaupt eine Textdatei öffnen läßt). Dies funktioniert natürlich auch mit jedem anderem Terminalprogramm oder Skript, welches eine Ausgabe auf stdout liefert:

#:~>ls -Ghl | pbcopy
#:~>grep blabla Test.txt | pbcopy
#:~>Mein_Skript.sh | pbcopy
#:~>

Pbcopy bietet die wohl schnellste Möglichkeit die Ergebnisse von Terminalprogrammen in die grafische Oberfläche zu bekommen. Allerdings kann ein Fallstrick entstehen, wenn man fälschlicherweise anstelle der Pipeline (|), die Ausgabeumleitung (>) benutzt:

#:~>Mein_Skript.sh > pbcopy
#:~>

Das funktioniert zwar fehlerfrei, führt nicht zum gewünschten Ergebnis. Alle Ausgaben von Mein_Skript.sh werden durch die Ausgabeumleitung in eine neu angelegte Textdatei namens pbcopy geschrieben. Das Programm pbcopy wird weder ausgeführt, noch muss es überhaupt vorhanden sein! Ein einfaches ls im Terminal zeigt es.

Richtig interessant wird pbcopy aber erst im Netzwerk, denn es kann zum schnellen Datentransfer zwischen zwei Rechnern benutzt werden. Angenommen man möchte den Inhalt einer Textdatei von einem entfernten Rechner in die Zwischenablage des eigenen Rechners holen:

#:~>ssh User@Entfernter_Rechner "cat Test.txt" | pbcopy
User@Entfernter_Rechner password:
#:~>

Die Datei Test.txt wird auf dem entfernten Rechner ausgelesen, über das Netzwerk nach stdout auf dem eigenen Rechner transferiert und über die Pipeline direkt in die Zwischenablage geschrieben.

Das eigentlich bemerkenswerte an dieser Befehlsfolge ist aber, daß auf dem entfernten Rechner weder MacOS X, noch pbcopy vorhanden sein müssen! Es funktioniert mit jedem Rechner, sofern man sich dort mittels SSH einloggen kann. Etwas anders sieht der Fall aus, wenn man sich erst auf dem entfernten Rechner eingeloggt hat und dann versucht mit pbcopy zu arbeiten:

#:~>ssh User@Entfernter_Rechner
User@Entfernter_Rechner password:
User@Entfernter_Rechner:~>cat Test.txt | pbcopy
#:~>

In diesem Falle arbeitet man mit stdin und stdout auf dem entfernten Rechner, d.h. es wird pbcopy auf dem entfernten Rechner und somit i.d.R. MacOS X benötigt. Außerdem würde diese Befehlsfolge den Inhalt der Datei in Zwischenablage des entfernten Rechners schreiben (was unter bestimmten Bedingungen auch durchaus sinnvoll sein kann) und nicht über das Netzwerk auf den eigenen Rechner transferieren.

Ein weiteres Anwendungsgebiet von pbcopy und pbpaste kann in Kombination mit dem do shell-Befehl von AppleSkript liegen, auch wenn AppleSkript einen eigenen Befehl zum Zugriff auf die Zwischenablage (the clipboard) bietet.

Linux

Unter Linux und in X11-Umgebungen leisten xsel und xclip analoge Funktionalität. Ubuntu-Benutzer müssen xclip und xsel noch nachinstallieren, was auf der Kommandozeile mit einem einfachen sudo apt-get install xclip bzw. sudo apt-get install xsel gemacht wird. Der Ablauf sollte ungefähr wie folgt aussehen:

#:~>sudo apt-get install xclip
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Lese Status-Informationen ein... Fertig
Die folgenden NEUEN Pakete werden installiert:
  xclip
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 117 nicht aktualisiert.
Es müssen 16,6kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 77,8kB Plattenplatz zusätzlich benutzt.
Hole:1 http://de.archive.ubuntu.com jaunty/universe xclip 0.08-8 [16,6kB]
Es wurden 16,6kB in 4s geholt (3403B/s)
Wähle vormals abgewähltes Paket xclip.
(Lese Datenbank ... 104291 Dateien und Verzeichnisse sind derzeit installiert.)
Entpacke xclip (aus .../archives/xclip_0.08-8_i386.deb) ...
Verarbeite Trigger für man-db ...
Richte xclip ein (0.08-8) ...
#:~>apt-get install xsel
[sudo] password for Globenaut:
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut       
Lese Status-Informationen ein... Fertig
Die folgenden NEUEN Pakete werden installiert:
  xsel
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 117 nicht aktualisiert.
Es müssen 19,2kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 86,0kB Plattenplatz zusätzlich benutzt.
Hole:1 http://de.archive.ubuntu.com jaunty/universe xsel 1.2.0-1 [19,2kB]
Es wurden 19,2kB in 0s geholt (39,3kB/s)
Wähle vormals abgewähltes Paket xsel.
(Lese Datenbank ... 104284 Dateien und Verzeichnisse sind derzeit installiert.)
Entpacke xsel (aus .../archives/xsel_1.2.0-1_i386.deb) ...
Verarbeite Trigger für man-db ...
Richte xsel ein (1.2.0-1) ...
#:~>

Wie fast immer unter Linux erhält man mit xclip -h oder man xclip Informationen zur Benutzung von xclip und analog für xsel.
Für das Schreiben der Daten in die Zwischenablage gibt es, wie meistens, mehrere Wege:

#:~>xclip Test.txt
#:~>
#:~>cat Test.txt | xclip
#:~>

Von der Zwischenablage ins Terminal kann man es so machen:

#:~>xclip -o
#:~>Ich bin Text aus der Zwischenablage von Ubuntu.

Wie schon im Abschnitt von MacOS X, kann man eine Datei direkt übers Netzwerk in die Zwischenablage einlesen, ohne daß auf dem entfernten Rechner die Terminalprogramme vorhanden sein müssen. Eine ssh-Verbindung reicht aus:

#:~>ssh User@Entfernter_Rechner "cat Test.txt" | xclip
User@Entfernter_Rechner password:
#:~>

Da UNIX im Grunde meherere Zwischenablagen [2] kennt, kann man diese auch gezielt ansprechen, wenn es notwendig sein sollte. Meist reicht aber die Voreinstellung aus.

#:~>ssh User@Entfernter_Rechner "cat Test.txt" | xclip -selection clipboard -i
User@Entfernter_Rechner password:
#:~>

Wer in diesem Falle öfter Daten vom Terminal in die Zwichenablage übertragen muß, sollte sich ein alias in der .bashrc anlegen, damit alles was an xclip geleitet wird, automatisch in der Zwischenablage landet:

alias xclip -selection clipboard

  1. http://developer.apple.com/DOCUMENTATION/Darwin/Reference/ManPages/man1/pbcopy.1.html
  2. http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt

Labels: , , , , , , , , , , , ,

#
Kommentare:
Kommentar veröffentlichen

Neuester Eintrag
Piratenblogger
Glauben ist die mutwillige Nichtbenutzung des Verstandes!
Bundestagswahl 2009: Weg mit dem Gesindel von SPD und C*U!
© 2005-2009, GlobenautDieses Blog wird unterstützt von Blogger.