'xclip' बनाम 'xsel'


43

एक्स क्लिपबोर्ड तक पहुंचने के लिए दो कमांड-लाइन टूल (दो अलग-अलग पैकेजों में) हैं:

  • xclip
  • xsel

मैं उन दोनों के बीच अंतर जानना पसंद करूंगा और एक सिफारिश सुनूंगा कि कौन से मामलों में उपयोग करना है।


1
बिल्कुल वही जो मैं आज जानना चाहता था :) +1
विनयुनुच्स

जवाबों:


26

दोनों xclipऔर xselमें पाठ स्टोर कर सकते हैं 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इस तथ्य में भी जीत है कि आप क्लिपबोर्ड की सामग्री को फाइल करने के लिए आउटपुट कर सकते हैं (जो कि संभवतः तब उपयोगी होता है जब आप प्राथमिक चयन, यानी हाइलाइट को पुनर्निर्देशित करना चाहते हैं)। xselstdout को केवल आउटपुट प्रदान करता है


2
तो वहाँ कोई अंतर नहीं है सिवाय इसके कि xselकेवल STDIN / STDOUT के माध्यम से काम कर सकते हैं, जबकि xclipवहाँ भी असली फ़ाइलों का उपयोग कर सकते हैं? कितना उबाऊ है! ठीक है, मैंने xselकुछ समय पहले दोस्त बनाए थे और शेल पुनर्निर्देशन के साथ फ़ाइलों का उपयोग करके रह सकते हैं, इसलिए मैं इसका उपयोग करता रहूंगा।
बाइट कमांडर

2
जब तक मैंने मैन पेजों में कुछ याद नहीं किया है या कुछ छिपी हुई विशेषताएं नहीं हैं, तो वास्तव में इन दो कार्यक्रमों के लिए है :) दोनों काफी अच्छा काम कर रहे हैं, इसलिए मुझे लगता है कि यह किसी भी चीज से अधिक प्राथमिकता है
सर्गीय कोलोडाज़नी डे

मैंने xclipआज स्थापित किया और सोचा कि क्या यह सही विकल्प है। आपके उत्तर की पुष्टि हुई क्योंकि मैं क्लिपबोर्ड से diffकमांड के साथ उपयोग करने के लिए फाइल बना रहा था । +1 धन्यवाद :)
विनयुनुच्स

1
मैं एक पोस्ट भर में दौड़ा एक उत्कृष्ट आवरण समारोह के लिए xclip है कि पैमाने को दूर कर सकते हैं यह पक्ष में है। madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip
ड्रैगन 788

@ dragon788 अच्छी तरह से, यह अच्छा है, लेकिन सवाल दो आज्ञाओं के उपयोग में अंतर के बारे में है, इसलिए मैं यह नहीं देखता कि यह कैसे प्रासंगिक है
सेर्गेई कोलोडियाज़नी

22

@ शेर के जवाब के अलावा , आर्क विकी में Tmux पेज से जानकारी का एक टुकड़ा है जो कुछ विशिष्ट कार्यों में उपयोगी हो सकता है :

xsel के विपरीत [xclip] कच्चे बिटस्ट्रीम को प्रिंट करने में बेहतर काम करता है जो वर्तमान लोकेल में फिट नहीं होता है। फिर भी, यह xclip के बजाय xsel का उपयोग करने के लिए neater है, क्योंकि tmux के बफर से पढ़े जाने के बाद xl STDOUT को बंद नहीं करता है । इस प्रकार, tmux को पता नहीं है कि प्रतिलिपि कार्य पूरा हो गया है, और xclip की समाप्ति की प्रतीक्षा करना जारी रखता है, जिससे tmux अप्रतिसादी हो जाता है। एक वर्कअराउंड STDOUT xclip को / 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 इस पर निर्भर हैं।
जोश

6

उपयोग करें 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- स्क्रीनशॉट से "कॉपी टू क्लिपबोर्ड" बटन का उपयोग कर मुझे कोई आउटपुट नहीं मिलता है। जब एक लिब्रे ऑफिस डॉक्यूमेंट से 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 कट बफर 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);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.