'xclip' vs. 'xsel'

43

Ada dua alat baris perintah (dalam dua paket berbeda) untuk mengakses papan klip X:

  • xclip
  • xsel

Saya akan senang mengetahui perbedaan antara keduanya dan mendengar rekomendasi mana yang harus digunakan dalam hal ini.

Komandan Byte
sumber
1
Persis apa yang ingin saya ketahui hari ini :) +1
WinEunuuchs2Unix

Jawaban:

26

Keduanya xclipdan xseldapat menyimpan teks ke dalam 3 pilihan berbeda (secara default itu adalah pemilihan utama). Dari pengalaman saya tahu bahwa pemilihan utama pada dasarnya adalah apa yang Anda soroti dan dirilis dengan klik tengah mouse (yang sesuai dengan menekan tombol touchpad kanan dan kiri pada laptop). Papan klip adalah tradisional CtrlV.

Dengan memeriksa manhalaman untuk keduanya, saya telah menemukan bahwa xclipmenang dalam satu aspek - membaca dari file 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)

Tentu saja Anda bisa menggunakan pengalihan shell dengan xseluntuk menyiasatinya

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclipjuga menang dalam kenyataan bahwa Anda dapat menampilkan konten clipboard ke file (yang mungkin berguna ketika Anda ingin mengarahkan pemilihan PRIMARY, yaitu highlight). xselhanya menawarkan output ke stdout

Sergiy Kolodyazhnyy
sumber
2
Jadi tidak ada perbedaan kecuali yang xselhanya dapat beroperasi melalui STDIN / STDOUT, sementara xclipjuga dapat menggunakan file nyata di sana? Betapa membosankan! Yah, saya berteman dengan xselbeberapa waktu lalu dan dapat hidup dengan menggunakan pengalihan shell ke file, jadi saya akan terus menggunakannya.
Byte Commander
2
Kecuali saya telah melewatkan sesuatu di halaman manual atau ada beberapa fitur tersembunyi, itu benar-benar semua yang ada di kedua program ini :) Keduanya melakukan pekerjaan yang cukup baik, jadi saya rasa ini lebih merupakan preferensi daripada apa pun
Sergiy Kolodyazhnyy
Saya menginstal xcliphari ini dan bertanya-tanya apakah itu pilihan yang tepat. Jawaban Anda mengonfirmasi itu karena saya membuat file dari clipboard untuk digunakan dengan diffperintah. +1 Terima kasih :)
WinEunuuchs2Unix
1
Saya berlari melintasi sebuah pos memiliki fungsi pembungkus yang sangat baik untuk xclip yang mungkin memberi tip pada skala yang mendukungnya. madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788
@ dragon788 baik, ini bagus tapi pertanyaannya adalah tentang perbedaan dalam penggunaan dua perintah, jadi saya tidak begitu mengerti bagaimana ini relevan
Sergiy Kolodyazhnyy
22

Selain jawaban @Serg , ada informasi dari halaman Tmux di Arch Wiki yang dapat berguna dalam beberapa kasus tertentu :

tidak seperti xsel, [xclip] berfungsi lebih baik untuk mencetak bitstream mentah yang tidak sesuai dengan lokal saat ini. Namun demikian, lebih baik menggunakan xsel daripada xclip, karena xclip tidak menutup STDOUT setelah membaca dari buffer tmux. Karena itu, tmux tidak tahu bahwa tugas penyalinan telah selesai, dan terus menunggu penghentian xclip, sehingga membuat tmux tidak responsif. Solusinya adalah dengan mengarahkan STDOUT dari xclip ke / dev / null

PlasmaBinturong
sumber
Masalah STDOUT dengan ini tidak menutupxclip adalah masalah besar jika Anda menjumpainya. Saya membuang waktu 2 jam untuk men-debug-nya. Saya akhirnya beralih ke xsel -bidan xsel -bo.
Bruno Bronosky
15

Hal lain yang perlu diingat, xselmemiliki lebih sedikit ketergantungan daripada 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
Martin K
sumber
2
Saya menduga sebagian besar instalasi sudah memiliki libxmu6, banyak paket seperti xterm, x11-apps, dan x11-utils bergantung padanya.
JoshB
6

Gunakan xclip, karena xseltidak bisa mengekstrak data biner dari clipboard, seperti screenshost. Misalnya, simpan tangkapan layar ke clipboard:

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

Kemudian simpan ke file dan bandingkan 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
techtonik anatoly
sumber
1
Saya menemukan bahwa xcliptidak selalu selalu dapat menangani data biner baik, misalnya ketika menggunakan tombol "Salin ke clipboard" dari gnome-tangkapan layar saya tidak mendapatkan hasil sama sekali. Saat menyalin gambar dengan Ctrl + C dari mis. Dokumen LibreOffice, itu hanya berfungsi jika saya secara manual menentukan jenis target seperti xclip -o -t image/png -selection clipboard.
Byte Commander
2
Saya tidak mendapatkan output gnome-screenshotsama sekali, tapi itu masalah lain - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
anatoly techtonik
0

Ada satu alasan lain untuk menggunakan xclip over xsel - xclip dapat memanipulasi cut buffer 0, dengan melewati -selection buffer-cut, yang tidak bisa dilakukan xsel.

Relatif mudah untuk memungkinkannya memanipulasi buffer cut lainnya juga; ini patch saya, meskipun tidak teruji dengan baik dan tidak ada jaminan.

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

Josh
sumber