1315 Stimmen

Pipe in/aus der Zwischenablage in einem Bash-Skript

Ist es möglich, Pipe zu/von der Zwischenablage in Bash?

Egal, ob es sich um Piping zu/von einem Geräte-Handle oder um eine Hilfsanwendung handelt, ich kann nichts finden.

Zum Beispiel, wenn /dev/clip war ein Gerät, das mit der Zwischenablage verbunden war, was wir tun konnten:

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard

5voto

otto Punkte 1423

Unter Linux funktioniert dies:

cat filename | xclip

4voto

lurix66 Punkte 400

Gestern habe ich mich mit der Frage konfrontiert: "Wie kann ich die Zwischenablage für verschiedene Benutzersitzungen freigeben?" . Beim Wechsel zwischen Sitzungen mit Ctrl + Alt + F7 - Ctrl + Alt + F8 Sie können nämlich nicht einfügen, was Sie kopiert haben.

Ich habe mir Folgendes ausgedacht schnell und schmutzig Lösung, die auf einer benannten Leitung basiert. Es ist sicherlich ziemlich kahl und roh, aber ich fand es funktional:

user1@host:~$ mkfifo /tmp/sharedClip

dann im sendenden Terminal

user1@host:~$ cat > /tmp/sharedClip

zuletzt im Empfangsterminal:

user2@host:~$ cat /tmp/sharedClip

Nun können Sie im ersten Terminal etwas eintippen oder einfügen und (nachdem Sie auf Return ), erscheint er sofort im Empfangsterminal, von wo aus Sie ihn an beliebiger Stelle kopieren und wieder einfügen können.

Natürlich wird dabei nicht einfach nur der Inhalt aus der Zwischenablage von Benutzer 1 genommen, um ihn in der Zwischenablage von Benutzer 2 verfügbar zu machen, sondern es ist ein zusätzliches Paar Klicks für Einfügen und Kopieren erforderlich.

4voto

Braden Best Punkte 8182

Dazu gibt es mehrere Möglichkeiten. Einige der Möglichkeiten, die bereits erwähnt wurden, sind (glaube ich) tmux , Bildschirm , Vim , Emacs und die Schale. Ich kenne weder Emacs noch Screen, also gehe ich auf die anderen drei ein.

Tmux

Obwohl es keine X-Auswahl ist, hat tmux einen Kopiermodus, der über prefix-[ ( prefix ist Ctrl + B standardmäßig). Der für diesen Modus verwendete Puffer ist separat und exklusiv für tmux, was einige Möglichkeiten eröffnet und ihn in den richtigen Situationen vielseitiger macht als die X-Auswahl.

Um diesen Modus zu verlassen, drücken Sie Q zu navigieren, verwenden Sie Ihre Vim- oder Emacs-Bindung (Standard = Vim), also hjkl für Bewegung, v/V/C-v für die Auswahl von Zeichen/Zeilen/Blöcken usw. Wenn Sie Ihre Auswahl getroffen haben, drücken Sie Enter um zu kopieren und den Modus zu verlassen.

Um aus diesem Puffer einzufügen, verwenden Sie prefix-] .

Shell

Jede Installation von X11 scheint standardmäßig mit zwei Programmen geliefert zu werden: xclip y xsel (so wie es auch mit beiden startx y xinit ). Die meisten der anderen Antworten erwähnen xclip und ich mag wirklich xsel für seine Kürze, daher werde ich auf xsel .

Von xsel(1x) :

Eingabeoptionen \

-a, --append \

die Standardeingabe an die Auswahl anhängen. Impliziert -i .

-f, --follow \

an die Auswahl anhängen, wenn die Standardeingabe wächst. Impliziert -i .

-i, --input \

die Standardeingabe in die Auswahl einlesen.

Ausgabeoptionen \

-o, --output \

schreibt die Auswahl auf die Standardausgabe.

Handlungsoptionen \

-c, --clear \

die Auswahl aufheben. Setzt alle Eingabeoptionen außer Kraft.

-d, --delete \

Beantragen, dass die aktuelle Auswahl gelöscht wird. Dies löscht nicht nur die Auswahl, sondern fordert auch das Programm, in dem sich die Auswahl befindet, auf, den ausgewählten Inhalt zu löschen. Übersteuert alle Eingabeoptionen.

Auswahlmöglichkeiten \

-p, --primär \

mit der Auswahl PRIMARY arbeiten (Standard).

-s, --sekundär \

auf die Auswahl SEKUNDÄR einwirken.

-b, -clipboard \

auf die Auswahl CLIPBOARD einwirken.

Und das ist alles, was Sie wissen müssen. p (oder nichts) für PRIMARY , s para SECONDARY , b para CLIPBOARD , o für die Ausgabe.

Beispiel: Ich möchte die Ausgabe von foo von einem TTY und fügen Sie es auf einer Webseite für einen Fehlerbericht ein. Um dies zu tun, wäre es ideal, von/nach der TTY/X-Sitzung zu kopieren. Die Frage lautet also Wie kann ich vom TTY aus auf die Zwischenablage zugreifen?

In diesem Beispiel gehen wir davon aus, dass die X-Sitzung angezeigt wird :1 .

$ foo -v
Error: not a real TTY
details:
blah blah @ 0x0000000040abeaf4
blah blah @ 0x0000000040abeaf8
blah blah @ 0x0000000040abeafc
blah blah @ 0x0000000040abeb00
...
$ foo -v | DISPLAY=:1 xsel -b # copies it into clipboard of display :1

Dann kann ich Ctrl + V wie gewohnt in das Formular ein.

Angenommen, jemand auf der Support-Website gibt mir einen Befehl, den ich ausführen soll, um das Problem zu beheben. Er ist kompliziert und lang.

$ DISPLAY=:1 xsel -bo
sudo foo --update --clear-cache --source-list="http://foo-software.com/repository/foo/debian/ubuntu/xenial/164914519191464/sources.txt"
$ $(DISPLAY=:1 xsel -bo)
Password for braden:
UPDATING %%%%%%%%%%%%%%%%%%%%%%% 100.00%
Clearing cache...
Fetching sources...
Reticulating splines...
Watering trees...
Climbing mountains...
Looking advanced...
Done.
$ foo
Thank you for your order. A pizza should arrive at your house in the next 20 minutes. Your total is $6.99

Pizza bestellen scheint eine produktive Nutzung der Befehlszeile zu sein.

...weitergehen.

Vim

Wenn kompiliert mit +clipboard (Dies ist wichtig! Prüfen Sie Ihr vim --version ), sollte Vim Zugriff auf die X PRIMARY y CLIPBOARD Auswahlen. Die beiden Auswahlen sind über das Menü * y + Register und können wie jedes andere Register nach Belieben beschrieben und ausgelesen werden.

Zum Beispiel:

:%y+    ; copy/yank (y) everything (%) into the CLIPBOARD selection (+)
"+p     ; select (") the CLIPBOARD selection (+) and paste/put it
ggVG"+y ; Alternative version of the first example

Falls Ihre Kopie von Vim den Zugriff auf X-Auswahlen nicht direkt unterstützt, ist das allerdings kein Weltuntergang. Sie können einfach die xsel Technik wie im letzten Abschnitt beschrieben.

:r ! xsel -bo ; read  (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b  ; write (w) to the stdin of    (!) `xsel -b`

Binden Sie ein paar Tastenkombinationen und Sie sollten gut sein.

2voto

VonC Punkte 1117238

Aus diesem Thread geht hervor, dass es eine Option gibt, die keine Installation von gclip / xclip / xsel Software von Drittanbietern.

Ein Perl-Skript (da Perl normalerweise immer installiert ist)

use Win32::Clipboard;
print Win32::Clipboard::GetText();

2voto

Harry Moreno Punkte 8993

En Rubinfarbener Oneliner hat mich inspiriert, es mit Python zu versuchen.

Angenommen, wir wollen einen Befehl, der den Inhalt der Zwischenablage um vier Leerzeichen einrückt. Das ist perfekt, um Snippets auf Stack Overflow zu teilen.

$ pbpaste | python -c "import sys
 for line in sys.stdin:
   print(f'    {line}')" | pbcopy

Das ist kein Tippfehler. Python braucht Zeilenumbrüche, um eine für Schleife. Wir wollen die Zeilen in einem Durchgang ändern, um den Aufbau eines zusätzlichen Arrays im Speicher zu vermeiden.

Wenn es Ihnen nichts ausmacht, das zusätzliche Array zu bauen, versuchen Sie es:

$ pbpaste | python -c "import sys; print(''.join([f'    {l}' for l in sys.stdin]))" | pbcopy

aber ehrlich gesagt ist awk für diese Aufgabe besser geeignet als Python. Ich habe diesen Alias in meinem ~/.bashrc Datei

alias indent="pbpaste | awk '{print \"    \"\$0}' | pbcopy"

Wenn ich jetzt indent wird alles, was sich in meiner Zwischenablage befindet, eingerückt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X