86 votes

xclip" et "xsel".

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

  • xclip
  • xsel

J'aimerais connaître la différence entre les deux et entendre une recommandation sur le choix de l'un ou l'autre dans les différents cas.

48voto

Sergiy Kolodyazhnyy Points 97292

Les deux sites xclip y xsel peut stocker du texte dans 3 sélections différentes (par défaut, c'est la sélection primaire). Par expérience, je sais que la sélection primaire est essentiellement ce que vous mettez en évidence et relâchez avec le clic central de la souris (ce qui correspond à appuyer sur les touches droite et gauche du pavé tactile sur un ordinateur portable). Le presse-papiers est le traditionnel CtrlV .

En examinant le man des pages pour les deux, cependant, j'ai découvert que xclip gagne sur un aspect - la lecture d'un fichier d'entrée :

$ cat testfile.txt                                                             
HELLOWORLD

$ xclip -selection clipboard testfile.txt

$ HELLOWORLD
mksh: HELLOWORLD: not found

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

Bien sûr, vous pourriez utiliser la redirection Shell avec xsel pour contourner ce problème

$ xsel --clipboard < testfile.txt                                              

$ HELLOWORLD
mksh: HELLOWORLD: not found

xclip gagne également sur le fait que vous pouvez sortir le contenu du presse-papiers vers un fichier (ce qui est peut-être utile lorsque vous voulez rediriger la sélection PRIMAIRE, c'est-à-dire les points forts). xsel offre uniquement la sortie vers stdout

34voto

PlasmaBinturong Points 819

En plus de @Serg réponse il y a un élément d'information de la Page Tmux dans l'Arch Wiki qui peuvent être utiles dans certains cas particuliers :

Contrairement à xsel, [xclip] fonctionne mieux lorsqu'il s'agit d'imprimer un flux binaire brut qui ne correspond pas à la locale actuelle. Néanmoins, il est plus propre d'utiliser xsel parce que xclip ne se ferme pas STDOUT après avoir lu dans le tampon tmux. Ainsi, tmux ne sait pas que la tâche de copie est terminée, et continue d'attendre que xclip se termine, rendant ainsi tmux non réactif. Une solution de contournement consiste à rediriger STDOUT a /dev/null :

27voto

Martin K Points 486

Autre chose à garder à l'esprit, xsel a 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

13voto

Moreaki Points 145

Utilisez xclip parce que xsel ne peut pas extraire les données binaires du presse-papiers, telles que les captures d'écran. Par exemple, enregistrer une capture d'écran dans le presse-papiers :

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

Ensuite, enregistrez dans un fichier et comparez les résultats :

$ 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

2voto

ash Points 1798

Il y a une autre raison d'utiliser xclip plutôt que xsel - xclip peut manipuler le tampon de coupe 0, en transmettant -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 correctif, bien qu'il ne soit pas bien testé et ne soit assorti d'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);

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X