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.
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.
Câu trả lời:
Cả hai xclip
và xsel
có 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.
man
Tuy nhiên, bằng cách kiểm tra các trang cho cả hai, tôi đã phát hiện ra rằng xclip
chiế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
xclip
cũ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). xsel
chỉ cung cấp đầu ra cho thiết bị xuất chuẩn
xsel
chỉ có thể hoạt động thông qua STDIN / STDOUT, trong khi xclip
cũ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 xsel
cá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ó.
xclip
ngà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 diff
lệnh. +1 Cảm ơn :)
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
xclip
là 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 -bi
và xsel -bo
.
Một điều khác cần ghi nhớ, xsel
có í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
Sử dụng xclip
, vì xsel
khô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
xclip
khô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
.
gnome-screenshot
, nhưng đó là một vấn đề khác - gitlab.gnome.org/GNOME/gnome-sc Muff /issues / 14
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);