'xclip'대 'xsel'


43

X 클립 보드에 액세스하기위한 두 가지 명령 줄 도구 (두 가지 패키지로 제공)가 있습니다.

  • xclip
  • xsel

나는 그 두 가지의 차이점을 알고 싶습니다. 어떤 경우에 어떤 것을 사용해야하는지 추천합니다.


1
내가 오늘 알고 싶었던 것 :) +1
WinEunuuchs2Unix

답변:


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)

물론 당신은 쉘 리디렉션을 사용할 수 xsel있음을 해결하기 위해

xieerqi:
$ xsel --clipboard < testfile.txt                                              

xieerqi:
$ HELLOWORLD
mksh: HELLOWORLD: not found

xclip또한 클립 보드의 내용을 파일로 출력 할 수 있다는 사실에서 승리합니다 (이는 PRIMARY selection, 즉 하이라이트를 리디렉션 할 때 유용 할 수 있습니다). xsel표준 출력으로 만 출력 제공


2
따라서 xselSTDIN / STDOUT을 통해서만 작동 xclip할 수 있고 실제 파일도 사용할 수 있다는 점을 제외하고는 차이가 없습니다 . 지루 해요! 글쎄, 나는 xsel얼마 전에 친구를 사귀 었고 파일에 대한 쉘 리디렉션을 사용하여 살 수 있기 때문에 계속 사용할 것입니다.
바이트 사령관

2
나는 그 사람 페이지에서 뭔가를 놓친 또는 어떤 숨겨진 기능은 내가 더 무엇보다 선호의 같아요 그래서 정말 모두 모두 충분히 좋은 일을하고있다 :이 두 프로그램이 사용자들은,이없는 한
세르지 Kolodyazhnyy

나는 xclip오늘 설치 했고 그것이 올바른 선택인지 궁금했다. 귀하의 답변은 클립 보드에서 diff명령 과 함께 사용할 파일을 만들고 있기 때문임을 확인했습니다 . +1 감사합니다 :)
WinEunuuchs2Unix

1
나는 게시물을 가로 질러 xclip을위한 훌륭한 래퍼 기능을 가지고있어 스케일을 유리하게 사용할 수 있습니다. madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
dragon788

@ dragon788 글쎄, 이것은 좋지만 질문은 두 명령의 사용법 차이에 관한 것이므로 이것이 어떻게 관련되는지 잘
모르겠습니다.

22

@Serg answer 외에도 Arch WikiTmux 페이지에는 특정 경우에 유용한 정보가 있습니다 .

xsel과 달리 [xclip]은 현재 로케일에 맞지 않는 원시 비트 스트림을 인쇄 할 때 더 잘 작동합니다. 그럼에도 불구하고 xclip은 tmux의 버퍼에서 읽은 후에 STDOUT닫지 않기 때문에 xclip 대신 xsel을 사용하는 것이 더 좋습니다 . 따라서 tmux는 복사 작업이 완료되었음을 알지 못하고 xclip이 종료 될 때까지 계속 기다리므로 tmux가 응답하지 않습니다. 해결 방법은 xclip의 STDOUT을 / dev / null로 리디렉션하는 것입니다.


없는 폐쇄 STDOUT의 와 문제는 xclip당신이 그것을 발생하면 큰 문제이다. 디버깅하는 데 2 ​​시간을 낭비했습니다. 드디어로 전환 xsel -bi하고 xsel -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

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-screenshot에서 "클립 보드로 복사"버튼을 사용할 때 이진 데이터를 처리 할 수있는 것은 아닙니다. 출력이 전혀 없습니다. 예를 들어 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 -selection buffer-cut이 수행 할 수없는 을 전달하여 컷 버퍼 0을 조작 할 수 있습니다.

다른 컷 버퍼도 조작하는 것이 비교적 쉽습니다. 여기에 내 패치가 있지만 잘 테스트되지 않았으며 보장되지 않습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.