'xclip' vs. 'xsel'


43

Esistono due strumenti da riga di comando (in due diversi pacchetti) per accedere agli Appunti X:

  • xclip
  • xsel

Mi piacerebbe conoscere la differenza tra quei due e sentire una raccomandazione quale usare in quali casi.


1
Esattamente quello che volevo sapere oggi :) +1
WinEunuuchs2Unix

Risposte:


26

Entrambi xclipe xselpossono memorizzare il testo in 3 diverse selezioni (per impostazione predefinita è la selezione primaria). Per esperienza, so che la selezione primaria è fondamentalmente ciò che hai messo in evidenza e rilasciato con il clic centrale del mouse (che corrisponde alla pressione del tasto destro e sinistro del touchpad su un laptop). Gli appunti sono i tradizionali CtrlV.

Esaminando le manpagine per entrambi, tuttavia, ho scoperto che xclipvince in un aspetto: leggere da un file di input:

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)

Ovviamente potresti usare il reindirizzamento della shell xselper aggirare il problema

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclipvince anche nel fatto che è possibile produrre il contenuto degli appunti su file (il che è forse utile quando si desidera reindirizzare la selezione PRIMARY, ovvero i momenti salienti). xseloffre solo output su stdout


2
Quindi non c'è alcuna differenza se non che xselpuò funzionare solo tramite STDIN / STDOUT, mentre xclippuò anche utilizzare file reali lì? Che noioso! Bene, ho fatto amicizia con xselun po 'di tempo fa e posso convivere con i reindirizzamenti della shell ai file, quindi continuerò a usarlo.
Byte Commander

2
A meno che non mi sia sfuggito qualcosa nelle pagine man o ci siano alcune funzionalità nascoste, questo è davvero tutto ciò che c'è da fare in questi due programmi :) Entrambi stanno facendo un buon lavoro, quindi immagino che sia più una preferenza che altro
Sergiy Kolodyazhnyy

Ho installato xclipoggi e mi chiedevo se fosse la scelta giusta. La tua risposta è stata confermata dal fatto che sto creando file dagli Appunti da utilizzare con il diffcomando. +1 Grazie :)
WinEunuuchs2Unix

1
Mi sono imbattuto in un post che ha un'eccellente funzione wrapper per xclip che potrebbe ribaltare la scala a suo favore. madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788

@ dragon788 bene, questo è carino ma la domanda riguarda la differenza nell'uso di due comandi, quindi non vedo bene quanto sia rilevante
Sergiy Kolodyazhnyy,

22

Oltre alla risposta di @Serg , ci sono informazioni dalla pagina di Tmux in Arch Wiki che possono essere utili in alcuni casi specifici :

a differenza di xsel it [xclip] funziona meglio sulla stampa di bitstream non adatti alle impostazioni locali correnti. Tuttavia, è meglio usare xsel invece di xclip, perché xclip non chiude STDOUT dopo aver letto dal buffer di tmux. Di conseguenza, tmux non sa che l'attività di copia è stata completata e continua ad attendere la chiusura di xclip, rendendo quindi tmux non rispondente. Una soluzione alternativa è reindirizzare STDOUT di xclip su / dev / null


Questo problema con STDOUT non chiusoxclip è un grosso problema se lo si incontra. Ho perso 2 ore a debug. Alla fine sono passato a xsel -bie xsel -bo.
Bruno Bronosky,

15

Qualcos'altro da tenere a mente, xselha meno dipendenze di 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
Ho il sospetto che la maggior parte delle installazioni abbia già libxmu6, molti pacchetti come xterm, x11-apps e x11-utils dipendono da esso.
JoshB,

6

Utilizzare xclip, perché xselnon è possibile estrarre i dati binari dagli Appunti, come screenshost. Ad esempio, salva screenshot negli appunti:

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

Quindi salva su file e confronta l'output:

$ 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
Trovo che xclipnon sia necessariamente sempre in grado di gestire dati binari, ad esempio quando si utilizza il pulsante "Copia negli Appunti" di gnome-screenshot non ottengo alcun output. Quando si copia un'immagine con Ctrl + C ad esempio da un documento LibreOffice, funziona solo se si specifica manualmente il tipo di destinazione come xclip -o -t image/png -selection clipboard.
Byte Commander

2
Non ricevo alcun risultato gnome-screenshot, ma questo è un altro problema - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
anatoly techtonik,

0

C'è un altro motivo per usare xclip su xsel: xclip può manipolare il buffer di taglio 0, passando -selection buffer-cut, cosa che xsel non può fare.

È relativamente facile consentirgli di manipolare anche gli altri buffer di taglio; ecco la mia patch, anche se non è ben testata e non ha garanzie.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.