'xclip' contre 'xsel'


43

Il existe deux outils de ligne de commande (dans deux packages différents) pour accéder au presse-papiers X:

  • xclip
  • xsel

J'aimerais connaître la différence entre les deux et entendre une recommandation à utiliser dans quels cas.


1
Exactement ce que je voulais savoir aujourd'hui :) +1
WinEunuuchs2Unix

Réponses:


26

Les deux xclipet xselpeuvent stocker du texte dans 3 sélections différentes (par défaut, c'est la sélection principale). Par expérience, je sais que la sélection principale est essentiellement ce que vous mettez en surbrillance et que vous relâchez avec le clic du milieu de la souris (ce qui correspond à la pression des touches droite et gauche du pavé tactile sur un ordinateur portable). Le presse-papiers est le traditionnel CtrlV.

En examinant les manpages pour les deux, cependant, j'ai découvert que cela xclipgagnait un aspect - lire à partir d'un fichier d'entrée:

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)

Bien sûr, vous pouvez utiliser la redirection de shell avec xselpour contourner ce problème.

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclipgagne également dans le fait que vous pouvez exporter le contenu du presse-papier dans un fichier (ce qui est peut-être utile lorsque vous souhaitez rediriger la sélection PRIMARY, à savoir les surbrillances). xseloffre uniquement la sortie sur stdout


2
Donc, il n'y a pas de différence, sauf que xselvous ne pouvez utiliser que via STDIN / STDOUT, tout en xcliputilisant des fichiers réels? Quel ennui! Eh bien, je me suis lié d’amitié xselil ya un certain temps et je peux vivre avec l’utilisation de redirections dans les fichiers, alors je vais continuer à l’utiliser.
Byte Commander

2
Sauf si quelque chose me manque dans les pages de manuel ou s'il y a des fonctionnalités cachées, c'est vraiment tout ce qu'il y a dans ces deux programmes :) Les deux font assez bien leur travail, donc je suppose que c'est plus une préférence qu'autre chose
Sergiy Kolodyazhnyy

J'ai installé xclipaujourd'hui et je me suis demandé si c'était le bon choix. Votre réponse a confirmé que c’est parce que je crée un fichier à partir du presse-papiers à utiliser avec la diffcommande. +1 merci :)
WinEunuuchs2Unix

1
J'ai rencontré un article qui possède une excellente fonction de wrapper pour xclip qui peut faire pencher la balance bien en sa faveur. madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788 Le

@ dragon788 bien, c'est bien, mais la question concerne la différence d'utilisation de deux commandes, donc je ne vois pas très bien en quoi cela est pertinent
Sergiy Kolodyazhnyy

22

En plus de la réponse @Serg , il existe une information de la page Tmux dans Arch Wiki qui peut être utile dans certains cas spécifiques :

contrairement à xsel, il [xclip] fonctionne mieux pour imprimer un flux de données brut qui ne correspond pas aux paramètres régionaux actuels. Néanmoins, il est préférable d'utiliser xsel au lieu de xclip, car xclip ne ferme pas STDOUT une fois qu'il a lu le tampon de tmux. En tant que tel, tmux ne sait pas que la tâche de copie est terminée et continue d'attendre la fin de xclip, rendant ainsi tmux inactif. Une solution de contournement consiste à rediriger STDOUT de xclip vers / dev / null


Ce problème ne fermant pas avec STDOUTxclip est un problème majeur si vous le rencontrez. J'ai perdu 2 heures à le déboguer. Je suis finalement passé à xsel -biet xsel -bo.
Bruno Bronosky le

15

Quelque chose d'autre à garder à l'esprit, xsela moins de dépendances que 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
Je suppose que la plupart des installations ont déjà libxmu6, cependant, de nombreux paquets tels que xterm, x11-apps et x11-utils en dépendent.
JoshB

6

Utilisez xclip, car xselne peut pas extraire des données binaires du presse-papiers, tels que screenshost. Par exemple, enregistrez la capture d'écran dans le presse-papiers:

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

Puis sauvegarder dans un fichier et comparer le résultat:

$ 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
Je trouve que ce xclipn'est pas nécessairement toujours capable de gérer des données binaires non plus, par exemple lorsque j'utilise le bouton "Copier dans le presse-papier" de gnome-screenshot, je ne reçois aucune sortie du tout. Lorsque vous copiez une image avec Ctrl + C à partir d'un document LibreOffice, par exemple, cela ne fonctionne que si je spécifie manuellement le type de cible, par exemple xclip -o -t image/png -selection clipboard.
Byte Commander

2
Je ne reçois pas de sortie du gnome-screenshottout, mais c'est un autre problème - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
anatoly techtonik Le

0

Il y a une autre raison d'utiliser xclip sur xsel - xclip peut manipuler le tampon de coupe 0, en passant -selection buffer-cut, ce que xsel ne peut pas faire.

Il est relativement facile de lui permettre de manipuler également les autres tampons de coupe; Voici mon patch, bien que ce n’est pas bien testé et qu’il n’ya aucune garantie.

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);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.