'xclip' vs. 'xsel'


43

X panosuna erişmek için iki komut satırı aracı (iki farklı pakette) vardır:

  • xclip
  • xsel

Bu ikisi arasındaki farkı bilmek isterdim ve hangisinin hangi durumlarda kullanılacağına dair bir öneri duydum.


1
Tam olarak bugün bilmek istediklerim :) +1
WinEunuuchs2Unix

Yanıtlar:


26

Her ikisi de xclipve xselmetni 3 farklı seçime kaydedebilir (varsayılan olarak birincil seçimdir). Tecrübelerden, birincil seçimin temel olarak orta ışıkta klikleyeceğiniz ve bıraktığınız şey olduğunu biliyorum (bu, bir dizüstü bilgisayarda hem sağ hem de sol dokunmatik tuşa basmaya karşılık gelir). Pano gelenekseldir CtrlV.

manHer ikisinin de sayfalarını inceleyerek, bunun xclipbir yönden kazandığını keşfettim - bir girdi dosyasından okuma:

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)

Elbette xselbunun etrafında gezinmek için kabuk yönlendirme kullanabilirsiniz .

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclipayrıca, pano içeriğini dosyaya yazdırabileceğiniz gerçeğini de kazanır (bu da PRIMARY seçimini yönlendirmek istediğinizde faydalıdır, yani vurgulamalar yapar). xselsadece stdout'a çıktı sunar


2
Yani xselsadece STDIN / STDOUT ile çalışabiliyorken xclipgerçek dosyaları da kullanabiliyor olmanın dışında bir fark yok. Ne kadar sıkıcı! xselBir süre önce arkadaş edindim ve dosyalara kabuk yönlendirmeleri kullanarak yaşayabilirim, o yüzden kullanmaya devam edeceğim.
Byte Komutanı

2
Man sayfalarında bir şeyleri özlemediğim ya da bazı gizli özellikler olmadığı sürece, bu iki program için gerçekten hepsi bu kadar :) Her ikisi de yeterince iyi çalışıyor, bu yüzden sanırım her şeyden çok bir tercih.
Sergiy Kolodyazhnyy

xclipBugün kurdum ve doğru seçim olup olmadığını merak ettim. Cevabınız, diffkomutla kullanmak için panodan dosya oluşturduğumdu . +1 Thanks :)
WinEunuuchs2Unix

1
Bir yazıya rastladım, ölçeği lehine çevirebilecek xclip için mükemmel bir sarmalayıcı işlevi var. madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788 16:17

@ dragon788 iyi, bu güzel ama soru iki komutun kullanımındaki farkla ilgili, bu yüzden bunun ne kadar alakalı olduğunu tam olarak göremiyorum
Sergiy Kolodyazhnyy

22

@Serg cevabına ek olarak , Arch Wiki'deki Tmux sayfasından bazı özel durumlarda yararlı olabilecek bir bilgi parçası var :

xsel'den farklı olarak, [xclip] geçerli yerel ayara uymayan ham bit akışını yazdırmada daha iyi çalışır. Bununla birlikte, xclip yerine xsel kullanmak daha düzenlidir, çünkü xclip , tmux'un tampon belleğinden okuduktan sonra STDOUT'u kapatmaz . Bu nedenle, tmux kopyalama görevinin tamamlandığını bilmez ve xclip'in sonlandırılmasını beklemeye devam eder, bu nedenle tmux'u yanıt vermiyor. Bir çözüm, xclip'in STDOUT'unu / dev / null dizinine yönlendirmektir.


Bu STDOUT sorununu kapatmıyorsanızxclip , karşılaşırsanız büyük bir sorundur. 2 saat boyunca hata ayıklamakla harcadım. Sonunda xsel -bive geçti xsel -bo.
Bruno Bronosky

15

Akılda tutulması gereken başka bir şey, xselşunlardan daha az bağımlılığa sahiptir 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
Çoğu kurulumda zaten libxmu6 olduğundan şüpheleniyorum, xterm, x11-apps ve x11-utils gibi birçok paket buna bağlı.
JoshB

6

Kullan xclip, çünkü xselekran verileri gibi panodaki ikili verileri çıkaramazsınız. Örneğin, ekran görüntüsünü panoya kaydedin:

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

Sonra dosyaya kaydedin ve çıktıyı karşılaştırın:

$ 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
Bunun xclipher zaman ikili veriyi her zaman idare edemeyeceğini biliyorum , örneğin gnome-ekran görüntüsündeki "Panoya kopyala" düğmesini kullanırken hiçbir çıktı alamıyorum. Ctrl + C ile bir görüntüyü örneğin bir LibreOffice Belgesinden kopyalarken, hedef türünü elle belirtirsem çalışır xclip -o -t image/png -selection clipboard.
Byte Commander

2
Ben çıktı alamadım gnome-screenshothiç, ama bu başka bir konu var - gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
Anatoly techtonik

0

Xsel üzerinden xclip kullanmak için başka bir neden daha var - xclip, -selection buffer-cutxsel'in yapamayacağı şekilde geçerek 0 tamponunu değiştirebilir .

Diğer kesme tamponlarını da manipüle etmesine izin vermek nispeten kolaydır; işte benim yamam, ancak iyi bir şekilde test edilmemiş ve hiçbir garantisi olmadan geliyor.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.