'xclip' so với 'xsel'


43

Có hai công cụ dòng lệnh (trong hai gói khác nhau) để truy cập vào bảng tạm X:

  • xclip
  • xsel

Tôi rất muốn biết sự khác biệt giữa hai người đó và nghe một khuyến nghị nên sử dụng trong trường hợp nào.


1
Chính xác những gì tôi muốn biết ngày hôm nay :) +1
WinEunuuchs2Unix 18/03/2017

Câu trả lời:


26

Cả hai xclipxselcó thể lưu trữ văn bản thành 3 lựa chọn khác nhau (theo mặc định nó là lựa chọn chính). Từ kinh nghiệm tôi biết rằng lựa chọn chính về cơ bản là những gì bạn bật sáng và phát hành khi nhấp chuột giữa (tương ứng với việc nhấn cả phím cảm ứng phải và trái trên máy tính xách tay). Các clipboard là truyền thống CtrlV.

manTuy nhiên, bằng cách kiểm tra các trang cho cả hai, tôi đã phát hiện ra rằng xclipchiến thắng ở một khía cạnh - đọc từ tệp đầu vào:

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)

Tất nhiên bạn có thể sử dụng chuyển hướng vỏ xselđể đi xung quanh đó

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclipcũng chiến thắng trong thực tế là bạn có thể xuất nội dung của bảng tạm sang tệp (có lẽ hữu ích khi bạn muốn chuyển hướng lựa chọn CHÍNH, tức là các điểm nổi bật). xselchỉ cung cấp đầu ra cho thiết bị xuất chuẩn


2
Vì vậy, không có sự khác biệt ngoại trừ xselchỉ có thể hoạt động thông qua STDIN / STDOUT, trong khi xclipcũng có thể sử dụng các tập tin thực sự ở đó? Như thế nào là chán nản! Chà, tôi đã kết bạn xselcách đây một thời gian và có thể sống với việc sử dụng chuyển hướng shell cho các tệp, vì vậy tôi sẽ tiếp tục sử dụng nó.
Chỉ huy Byte

2
Trừ khi tôi đã bỏ lỡ điều gì đó trong các trang dành cho nam giới hoặc có một số tính năng ẩn, đó thực sự là tất cả các chương trình này :) Cả hai đều làm việc đủ tốt, vì vậy tôi đoán đó là một sở thích hơn bất cứ điều gì
Sergiy Kolodyazhnyy

Tôi đã cài đặt xclipngày hôm nay và tự hỏi nếu nó là sự lựa chọn đúng đắn. Câu trả lời của bạn đã xác nhận rằng đó là vì tôi đang tạo tệp từ clipboard để sử dụng bằng difflệnh. +1 Cảm ơn :)
WinEunuuchs2Unix 18/03/2017

1
Tôi đã chạy qua một bài đăng có chức năng bao bọc tuyệt vời cho xclip có thể vượt xa quy mô có lợi cho nó. madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788

@ dragon788 tốt, điều này thật tuyệt nhưng câu hỏi là về sự khác biệt trong cách sử dụng hai lệnh, vì vậy tôi không hiểu rõ điều này có liên quan như thế nào
Sergiy Kolodyazhnyy

22

Ngoài câu trả lời @Serg , có một phần thông tin từ trang Tmux trong Arch Wiki có thể hữu ích trong một số trường hợp cụ thể :

không giống như xsel, [xclip] hoạt động tốt hơn khi in dòng bit thô không phù hợp với ngôn ngữ hiện tại. Tuy nhiên, sẽ gọn gàng hơn khi sử dụng xsel thay vì xclip, vì xclip không đóng STDOUT sau khi nó đã đọc từ bộ đệm của tmux. Như vậy, tmux không biết rằng tác vụ sao chép đã hoàn thành và tiếp tục chờ kết thúc của xclip, do đó khiến tmux không phản hồi. Cách giải quyết là chuyển hướng STDOUT của xclip sang / dev / null


Điều này không đóng vấn đề STDOUT với xcliplà một vấn đề lớn nếu bạn gặp phải nó. Tôi đã lãng phí 2 giờ để gỡ lỗi nó. Cuối cùng tôi đã chuyển sang xsel -bixsel -bo.
Bruno Bronosky

15

Một điều khác cần ghi nhớ, xselcó ít phụ thuộc hơn 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
Tôi nghi ngờ hầu hết các cài đặt đã có libxmu6, nhiều gói như xterm, x11-apps và x11-utils phụ thuộc vào nó.
JoshB

6

Sử dụng xclip, vì xselkhông thể trích xuất dữ liệu nhị phân từ clipboard, chẳng hạn như Screenshost. Ví dụ: lưu ảnh chụp màn hình vào clipboard:

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

Sau đó lưu vào tập tin và so sánh đầu ra:

$ 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
Tôi thấy rằng xclipkhông nhất thiết phải luôn luôn có thể xử lý dữ liệu nhị phân, ví dụ: khi sử dụng nút "Sao chép vào bảng tạm" từ ảnh chụp màn hình gnome tôi không nhận được kết quả nào cả. Khi sao chép một hình ảnh bằng Ctrl + C từ ví dụ Tài liệu LibreScript, nó chỉ hoạt động nếu tôi chỉ định thủ công loại mục tiêu như thế nào xclip -o -t image/png -selection clipboard.
Chỉ huy Byte

2
Tôi hoàn toàn không nhận được đầu ra gnome-screenshot, nhưng đó là một vấn đề khác - gitlab.gnome.org/GNOME/gnome-sc Muff /issues / 14
anatoly techtonik

0

Có một lý do khác để sử dụng xclip trên xsel - xclip có thể thao tác cắt bộ đệm 0, bằng cách chuyển -selection buffer-cut, điều mà xsel không thể làm được.

Nó cũng tương đối dễ dàng để cho phép nó điều khiển các bộ đệm cắt khác; Đây là bản vá của tôi, mặc dù nó không được kiểm tra tốt và không có gì đảm bảo.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.