'xclip'与'xsel'


Answers:


26

二者xclipxsel可以存储文本到3点不同的选择(默认为初级选择)。从经验中,我知道主要的选择基本上就是您的重点,并通过单击鼠标中键释放(对应于在笔记本电脑上同时按下左右触摸板键)。剪贴板是传统的CtrlV

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)

当然,您可以使用shell重定向xsel来解决该问题

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclip您还可以将剪贴板的内容输出到文件中(这在您要重定向PRIMARY选择(即突出显示)时可能很有用)也很成功。 xsel仅向stdout提供输出


2
因此,除了xsel只能通过STDIN / STDOUT进行操作之外,xclip还可以在那里使用真实文件,没有其他区别吗?真无聊!好吧,我xsel前一段时间交了朋友,可以使用shell重定向到文件,所以我会继续使用它。
字节指挥官

2
除非我错过了手册页中的某些内容或有一些隐藏的功能,否则这两个程序实际上就是所有这些:)两者都做得很好,所以我想它比什么都更偏爱
Sergiy Kolodyazhnyy

xclip今天安装了,想知道这是否是正确的选择。您的答案证实这是因为我正在从剪贴板创建文件以与diff命令一起使用。+1谢谢:)
WinEunuuchs2Unix

1
我碰到了一个帖子,该帖子具有出色的xclip包装功能,可能会使比例偏小。madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788

@ dragon788好,这很好,但是问题是关于两个命令的用法不同,所以我不太明白这有什么关系
Sergiy Kolodyazhnyy

22

除了@Serg 答案之外Arch WikiTmux页面还提供了一些信息这些信息在某些特定情况下很有用:

与xsel不同,[xclip]在打印不适合当前语言环境的原始位流时效果更好。但是,使用xsel而不是xclip更加巧妙,因为xclip从tmux的缓冲区读取后不会关闭STDOUT。因此,tmux不知道复制任务已经完成,并继续等待xclip终止,从而使tmux无响应。一种解决方法是将xclip的STDOUT重定向到/ dev / null


如果遇到这种情况,这不能解决STDOUT问题,这xclip是一个主要问题。我浪费了2个小时来调试它。我终于切换到xsel -bixsel -bo
布鲁诺·布鲁诺斯基

15

需要记住的其他事情是,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

2
我怀疑大多数安装程序已经具有libxmu6了,许多软件包,例如xterm,x11-apps和x11-utils都依赖于它。
JoshB,2016年

6

使用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

1
我发现它xclip也不一定总是能够处理二进制数据,例如,当使用gnome屏幕截图中的“复制到剪贴板”按钮时,根本没有输出。当从诸如LibreOffice Document使用Ctrl + C复制图像时,仅当我手动指定目标类型时,它才起作用xclip -o -t image/png -selection clipboard
字节指挥官

2
我一点也没有得到输出gnome-screenshot,但这是另一个问题-gitlab.gnome.org/GNOME/gnome-screenshot/issues/14
anatoly techtonik

0

在xsel上使用xclip的另一个原因是-xclip可以通过传递xsel来操纵剪切缓冲区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);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.