「xclip」と「xsel」


43

Xクリップボードにアクセスするための2つのコマンドラインツール(2つの異なるパッケージ)があります。

  • xclip
  • xsel

私はそれら2つの違いを知り、どのケースでどちらを使用するかの推奨事項を聞きたいです。


1
今日知りたかったこと:) +1
WinEunuuchs2Unix

回答:


26

両方でxclip3つの異なる選択にxselテキストを保存できます(デフォルトでは、プライマリ選択です)。経験から、基本選択は基本的に、ハイライト表示され、マウスの中央クリックでリリースされます(これはラップトップの左右のタッチパッドキーを押すことに相当します)。クリップボードは伝統的なものです。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選択、つまりハイライトをリダイレクトしたいときに便利です)。 xsel標準出力への出力のみを提供します


2
xselSTDIN / STDOUTを介してのみ操作できることと、そこでxclip実際のファイルを使用できることを除いて、違いはありませんか?なんてつまらない!さて、私はxsel少し前に友達を作り、ファイルへのシェルリダイレクトを使用して生きることができるので、それを使い続けます。
バイトコマンダー

2
これら二つのプログラムにあります:)の両方が十分に良い仕事をしている、私はそれがより多くの好みの何よりもだと思うので、本当に全てだと、私はmanページで何かを見逃しているか、いくつかの隠された機能がある場合を除き
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 WikiのTmuxページからの情報があります

xselとは異なり、[xclip]は現在のロケールに適合しない生のビットストリームを印刷するのに適しています。それでも、xclipは tmuxのバッファーから読み取った後、STDOUT閉じないため、xclipの代わりにxselを使用する方が適切です。そのため、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

6

screenshostなどのクリップボードからバイナリデータを抽出できないxclipため、を使用しxselます。たとえば、スクリーンショットをクリップボードに保存します。

$ 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ドキュメントなどから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を使用する理由はもう1つあります。xclipは-selection buffer-cut、xselができないを渡すことにより、カットバッファー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.