'xclip' vs. 'xsel'

There пахал two command-line tools (in two different packages) to access the X clipboard:

  • xclip
  • xsel

I would love to know the difference between those two and hear в recommendation which one to использовал in which вступи в брак.

43
задан 3 December 2015 в 13:25

6 ответов

И xclip и xsel может сохранить текст в 3 различных выбора (по умолчанию, это - основной выбор). На основе опыта я знаю, что основной выбор в основном, что Вы выделяете и выпущенный средним щелчком мышью (который соответствует нажатию обеих правых и левых сенсорных панелей, включают ноутбук). Буфером обмена является традиционный Ctrl V .

Путем исследования эти man страницы для обоих, однако, я обнаружил что xclip победы в одном аспекте - читающий из входного файла:

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)

, Конечно, Вы могли использовать перенаправление оболочки с xsel для обхождения этого

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclip также победы в том, что можно произвести содержание буфера обмена в файл (который, возможно, полезен, когда Вы хотите перенаправить ОСНОВНОЙ выбор, т.е. выделения). xsel предложения только вывод к stdout

26
ответ дан 23 November 2019 в 00:01

В дополнение к ответу @Serg , существует информация от страница Tmux в дуге Wiki , которая может быть полезной приблизительно в конкретные случаи :

в отличие от xsel это [xclip] работает лучше над печатью необработанного битового потока, который не соответствует текущей локали. Тем не менее, это более опрятно для использования xsel вместо xclip, потому что xclip не закрывает STDOUT после того, как это читало из буфера tmux. По сути, tmux не знает, что задача копии завершилась и продолжает ожидать завершения xclip, таким образом, представляя tmux безразличный. Обходное решение должно перенаправить STDOUT xclip к/dev/null

22
ответ дан 23 November 2019 в 00:01

Что-то еще для учета, xsel имеет меньше зависимостей, чем 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
15
ответ дан 23 November 2019 в 00:01

Используйте xclip , потому что xsel не может извлечь двоичные данные из буфера обмена, такие как screenshost. Например, сохраните снимок экрана к буферу обмена:

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

Затем сохраняют, чтобы зарегистрировать и сравнить вывод:

$ 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
6
ответ дан 23 November 2019 в 00:01

Существует еще одна причина использовать xclip по xsel – xclip, может управлять буфером сокращения 0, путем передачи -selection buffer-cut, который не может сделать xsel.

Относительно легко позволить этому управлять другими буферами сокращения также; вот мой патч, хотя он не хорошо протестирован и прибывает без гарантий.

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

0
ответ дан 23 November 2019 в 00:01

Для меня xclip позволит zsh shell выйти очень медленно при использовании guake.

Как выполнить команду: $ pwd | xclip -выбор c. Затем запустите $ exit, чтобы выйти из оболочки.

$ exit нужно несколько секунд, чтобы выйти.

xsel хорошо справляется с этой ситуацией.

0
ответ дан 9 July 2020 в 10:04

Другие вопросы по тегам:

Похожие вопросы: