'xclip' vs. 'xsel'


43

Es gibt zwei Befehlszeilentools (in zwei verschiedenen Paketen), um auf die X-Zwischenablage zuzugreifen:

  • xclip
  • xsel

Ich würde gerne den Unterschied zwischen diesen beiden kennen und eine Empfehlung hören, welche in welchen Fällen zu verwenden ist.


1
Genau das, was ich heute wissen wollte :) +1
WinEunuuchs2Unix

Antworten:


26

Beide xclipund xselkönnen Text in 3 verschiedenen Auswahlen speichern (standardmäßig ist dies die primäre Auswahl). Aus Erfahrung weiß ich, dass die primäre Auswahl im Grunde das ist, was Sie hervorheben und mit dem mittleren Mausklick freigeben (was dem Drücken der rechten und linken Touchpad-Taste auf einem Laptop entspricht). Die Zwischenablage ist die traditionelle CtrlV.

Beim Durchsuchen der manSeiten für beide habe ich jedoch festgestellt, dass xclipein Aspekt von Vorteil ist: das Lesen aus einer Eingabedatei:

xieerqi:
$ cat testfile.txt                                                             
HELLOWORLD

xieerqi:
$ xclip -selection clipboard testfile.txt

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xieerqi:
$ xsel testfile.txt 
Usage: xsel [options]
Manipulate the X sele . . . (usage page goes on)

Natürlich können Sie die Shell-Umleitung mit verwenden xsel, um das zu umgehen

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclipEs gewinnt auch daran, dass Sie den Inhalt der Zwischenablage in eine Datei ausgeben können (was möglicherweise nützlich ist, wenn Sie die PRIMARY-Auswahl umleiten möchten, dh Markierungen). xselbietet nur die Ausgabe auf stdout an


2
Es gibt also keinen Unterschied, außer dass xseldas nur über STDIN / STDOUT funktioniert, während dort xclipauch echte Dateien verwendet werden können? Wie langweilig! Nun, ich habe mich mit vor xseleiniger Zeit angefreundet und kann mit der Verwendung von Shell-Umleitungen zu Dateien leben, also werde ich das auch weiterhin verwenden.
Byte Commander

2
Es sei denn, ich habe etwas in den Manpages verpasst oder es gibt einige versteckte Funktionen, das ist wirklich alles, was diese beiden Programme zu bieten haben :) Beide machen ihren Job gut genug, also denke ich, es ist mehr eine Vorliebe als alles andere
Sergiy Kolodyazhnyy

Ich habe xclipheute installiert und mich gefragt, ob es die richtige Wahl war. Ihre Antwort wurde bestätigt, da ich eine Datei aus der Zwischenablage erstelle, die mit dem diffBefehl verwendet werden soll. +1 Danke :)
WinEunuuchs2Unix

1
Ich bin auf einen Beitrag gestoßen, der eine ausgezeichnete Wrapper-Funktion für xclip hat, die die Skala weit zu seinen Gunsten kippen kann. madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788

@ Dragon788 Nun, das ist schön, aber die Frage ist über den Unterschied in der Verwendung von zwei Befehlen, so dass ich nicht ganz sehe, wie dies relevant ist
Sergiy Kolodyazhnyy

22

Zusätzlich zur @ Serg- Antwort gibt es eine Information von der Tmux-Seite im Arch-Wiki , die in bestimmten Fällen nützlich sein kann :

Im Gegensatz zu xsel funktioniert [xclip] besser beim Drucken von unformatiertem Bitstream, der nicht zum aktuellen Gebietsschema passt. Trotzdem ist es sinnvoller, xsel anstelle von xclip zu verwenden, da xclip STDOUT nicht schließt, nachdem es aus dem Puffer von tmux gelesen hat. Daher weiß tmux nicht, dass der Kopiervorgang abgeschlossen ist, und wartet weiterhin auf die Beendigung von xclip, wodurch tmux nicht mehr reagiert. Eine Problemumgehung besteht darin, STDOUT von xclip nach / dev / null umzuleiten


Dieses nicht schließende STDOUT- Problem xclipist ein großes Problem, wenn Sie darauf stoßen. Ich habe 2 Stunden mit dem Debuggen verbracht. Ich habe endlich zu xsel -biund gewechselt xsel -bo.
Bruno Bronosky

15

Etwas anderes zu beachten, xselhat weniger Abhängigkeiten als xclip:

# apt-cache depends xsel
xsel
  Depends: libc6
  Depends: libx11-6
  Conflicts: xsel:i386

# apt-cache depends xclip
xclip
  Depends: libc6
  Depends: libx11-6
  Depends: libxmu6
  Conflicts: xclip:i386

2
Ich vermute, dass die meisten Installationen bereits libxmu6 haben, viele Pakete wie xterm, x11-apps und x11-utils hängen davon ab.
JoshB

6

Verwenden Sie xclip, weil xselnicht binäre Daten aus der Zwischenablage extrahiert werden können, z. B. Bildschirmhost. Speichern Sie beispielsweise den Screenshot in der Zwischenablage:

$ maim -s | xclip -selection clipboard -t image/png

Dann in Datei speichern und Ausgabe vergleichen:

$ xclip -o -selection clipboard > 1xclip
$ xsel -o --clipboard > 1xsel
$ ls -go 1*
-rw-rw-r-- 1 11948 Sep 26 20:13 1xclip
-rw-rw-r-- 1     0 Sep 26 20:13 1xsel

1
Ich finde, dass xclipdas auch nicht immer mit Binärdaten umgehen kann, zB wenn ich den "In Zwischenablage kopieren" -Button von gnome-screenshot benutze, bekomme ich überhaupt keine Ausgabe. Wenn Sie ein Bild mit Strg + C aus einem LibreOffice-Dokument kopieren, funktioniert dies nur, wenn Sie den Zieltyp wie manuell angeben xclip -o -t image/png -selection clipboard.
Byte Commander

2
Ich bekomme überhaupt keine Ausgabe gnome-screenshot, aber das ist ein weiteres Problem - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
anatoly techtonik

0

Es gibt noch einen weiteren Grund, xclip anstelle von xsel zu verwenden: xclip kann den Schnittpuffer 0 durch Übergabe manipulieren -selection buffer-cut, was xsel nicht kann.

Es ist relativ einfach zuzulassen, dass es auch die anderen Schnittpuffer manipuliert. Hier ist mein Patch, obwohl er nicht gut getestet ist und keine Garantie bietet.

diff --git a/xclip.c b/xclip.c
index 5fc760cb7..eeb05f662 100644
--- a/xclip.c
+++ b/xclip.c
@@ -35,11 +35,12 @@
 #include "xclib.h"

 /* command line option table for XrmParseCommand() */
-XrmOptionDescRec opt_tab[14];
+XrmOptionDescRec opt_tab[15];

 /* Options that get set on the command line */
 int sloop = 0;         /* number of loops */
 char *sdisp = NULL;        /* X display to connect to */
+int bufnum = 0;        /* Cut buffer number to use */
 Atom sseln = XA_PRIMARY;   /* X selection to work with */
 Atom target = XA_STRING;

@@ -165,6 +166,9 @@ doOptSel(void)
        break;
    case 'b':
        sseln = XA_STRING;
+       if (XrmGetResource(opt_db, "xclip.buffer", "Xclip.Buffer", &rec_typ, &rec_val)) {
+           bufnum = atoi(&rec_val.addr[0]);
+       }
        break;
    }

@@ -177,8 +181,10 @@ doOptSel(void)
        fprintf(stderr, "XA_SECONDARY");
        if (sseln == XA_CLIPBOARD(dpy))
        fprintf(stderr, "XA_CLIPBOARD");
-       if (sseln == XA_STRING)
+       if (sseln == XA_STRING) {
        fprintf(stderr, "XA_STRING");
+       fprintf(stderr, "\nUsing buffer number %d", bufnum);
+       }

        fprintf(stderr, "\n");
    }
@@ -276,7 +282,7 @@ doIn(Window win, const char *progname)

     /* Handle cut buffer if needed */
     if (sseln == XA_STRING) {
-   XStoreBuffer(dpy, (char *) sel_buf, (int) sel_len, 0);
+   XStoreBuffer(dpy, (char *) sel_buf, (int) sel_len, bufnum);
    return EXIT_SUCCESS;
     }

@@ -445,7 +451,7 @@ doOut(Window win)
     unsigned int context = XCLIB_XCOUT_NONE;

     if (sseln == XA_STRING)
-   sel_buf = (unsigned char *) XFetchBuffer(dpy, (int *) &sel_len, 0);
+   sel_buf = (unsigned char *) XFetchBuffer(dpy, (int *) &sel_len, bufnum);
     else {
    while (1) {
        /* only get an event if xcout() is doing something */
@@ -595,6 +601,11 @@ main(int argc, char *argv[])
     opt_tab[13].argKind = XrmoptionNoArg;
     opt_tab[13].value = (XPointer) xcstrdup(ST);

+    opt_tab[14].option = xcstrdup("-buffer");
+    opt_tab[14].specifier = xcstrdup(".buffer");
+    opt_tab[14].argKind = XrmoptionSepArg;
+    opt_tab[14].value = (XPointer) NULL;
+
     /* parse command line options */
     doOptMain(argc, argv);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.