การเข้าถึงคลิปบอร์ดบรรทัดคำสั่ง


10

ฉันกำลังสร้างเครื่องมือบรรทัดคำสั่งเพื่อทำให้งานของฉันมีประสิทธิภาพมากขึ้น ฉันต้องสามารถเขียนเนื้อหาไปยังคลิปบอร์ด แต่ด้วยเหตุผลบางอย่างมันไม่ทำงานสำหรับฉัน

ฉันได้พยายามติดตั้งทั้งในxclipและxselแต่ทั้งสองมีพฤติกรรมเดียวกัน: พวกเขาสามารถอ่าน / เขียนปรับคลิปบอร์ด แต่ฉันไม่สามารถเข้าถึงได้จากหลัก Ubuntu GUI

ฉันเคยลองใน terminal ...

echo "hello" | xclip

จากนั้นถ้าCtrl+ Shift+ Vฉันได้รับรายการคลิปบอร์ดดั้งเดิมไม่ใช่ "สวัสดี" แต่ถ้าฉันพยายามคว้าเนื้อหาxclipมันใช้งานได้ดี

เป้าหมายหลักคือการรับเนื้อหาที่วางใน Firefox หรือโปรแกรมอื่น ๆ ที่ใช้ GUI

คำตอบ:


16

มีคลิปบอร์ดที่แตกต่างกันสองสามตัวใน X :) อันที่xclipคัดลอกข้อความโดยค่าเริ่มต้นคือ "selection buffer" - โดยปกติแล้วคุณเพียงแค่เลือกข้อความด้วยเมาส์ของคุณจากนั้นสามารถวางมันด้วยปุ่มกลางของเมาส์ บัฟเฟอร์นี้แยกต่างหากจากที่คุณสามารถวางด้วย Ctrl-Shift-V

ลอง

echo "hello" | xclip -selection clipboard

ยังดู

man xclip

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ xclip


2
FYI ก็สามารถทำให้สั้นลงxclip -sel clipได้ ฉันใช้ส่วนตัวตลอดเวลา
Sergiy Kolodyazhnyy

ทำไมพระเจ้าถึงสับสนแบบนี้ทำไมทำไมคลิปบอร์ดถึงมีไม่พอดูman xclip -selection specify which X selection to use, options are "primary" to use XA_PRIMARY (default), "secondary" for XA_SECONDARY or "clipboard" for XA_CLIPBOARD
mxmlnkn

ดูเหมือนว่าการกระทำบ่อยคือ "เลือกข้อความด้วยเมาส์ของคุณ" เป็นไปได้หรือไม่ที่การกระทำเช่นเดียวกันกับแป้นพิมพ์
nilon

3

เพื่อให้ง่ายขึ้นสำหรับตัวฉันเองฉันได้สร้างนามแฝงxclipเพื่อเลียนแบบการทำงานของpbcopyและpbpasteใน Mac OS X

sudo apt-get install xclip -y

จากนั้นแก้ไขของคุณ~/.bashrcเพื่อเพิ่มชื่อแทน:

nano ~/.bashrc

เพิ่มบรรทัดใหม่เหล่านี้ (คุณสามารถวางไว้ที่ท้ายไฟล์):

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'

บันทึกและออกจากนั้นเปิดเชลล์ใหม่หรือรันsource ~/.bashrcเพื่อใช้นามแฝง

บล็อกโพสต์ของฉันมีรายละเอียดเพิ่มเติม


2

ฉันเคยใช้ยูทิลิตี้ wxcopy และ wxpaste จาก windowmaker แต่ดูเหมือนว่าลีนุกซ์รุ่นล่าสุด (หรือเวอร์ชั่น X) จะแตกหัก - ฉันสงสัยว่าระบบความปลอดภัยได้ถูกทำให้รัดกุมขึ้นและไม่ได้รับการอัพเดตให้ตรงกัน เช่นคุณสามารถทำสิ่งต่าง ๆ เช่น:

echo fred | wxcopy | tr "a-z" "A-Z" | wxpaste

เพื่อรับเอาต์พุต FRED (เป็นตัวอย่างที่ได้วางแผนไว้เนื่องจากคุณจะได้รับสิ่งเดียวกันโดยไม่มี wxpaste ขั้นสุดท้าย แต่ฉันคิดว่ามันให้รสชาติของสิ่งที่คุณสามารถทำได้)

อย่างไรก็ตามคุณสามารถใช้เอฟเฟกต์แบบเดียวกันได้โดยใช้แพ็คเกจ "xcb" ซึ่งมีน้ำหนักเบาอย่างไม่น่าเชื่อและยังมีการแสดงภาพขนาดเล็ก (สรุป) ของคลิปบอร์ด 8 คลิป

ฉันเขียนเชลล์สคริปต์ wcopy / wpaste เมื่อหลายปีก่อนเพื่อทำให้ wxcopy / wxpaste มีความสุขกับรสนิยมของฉันมากขึ้น ฉันอัปเดตพวกเขาคืนนี้เพื่อทำงานกับ wxcopy / wxpaste หรือ xcb นั่นทำให้พวกเขาซับซ้อนกว่าที่พวกเขาต้องการ แต่ฉันจะวางพวกเขาที่นี่หวังว่าพวกเขาจะไม่นานเกินไปสำหรับฟอรัมนี้

นี่คือ wcopy:

#!/bin/sh
#
# Provide some enhancements to the wxcopy command, which copies standard input
# to an X11 clipboard text buffer.
#
# Allow copying from stdin to any of the cutbuffers.  Note that they are
# indexed counting from 0.
#
# Author: Luke Kendall
#

if [ `uname -s` = "Darwin" ]
then
    WXCOPY=pbcopy
    WXPASTE=pbpaste
else
    WXCOPY=wxcopy
    WXPASTE=wxpaste
    BUFSPEC="-cutbuffer"
    xcb -p 0 > /tmp/wc$$
    if echo "fred$$" | wxcopy -cutbuffer 0 && [ `wxpaste` = "fred$$" ]
    then
        : # Great, they're actually working.  Not common on modern Linuxes.
        echo "working" > $HOME/.wcopyok
    else
        rm -f $HOME/.wcopyok
        WXCOPY="xcb -s"
        WXPASTE="xcb -p"
        BUFSPEC=
    fi
    xcb -s 0 < /tmp/wc$$
fi

unset WXARGS
if [ $# = 0 ]
then
    $WXCOPY ${WXCOPY_DEFS:-0}
else
    MYNAME=`basename $0`
    USAGE="usage: $MYNAME [ [0-9]... ] [$WXCOPY's args]"
    numlist=true
    for n
    do
        if $numlist && expr "x$n" : 'x[0-9][0-9]*$' > /dev/null
        then
            NUMARGS="$NUMARGS $n"
        else
            numlist=false
            if [ "x$n" = "x-h" ]
            then
                echo "$USAGE" >&2
                exit 0
            else
                WXARGS="$WXARGS $n"
            fi
        fi
    done
    set - $NUMARGS
    $WXCOPY $WXCOPY_DEFS $WXARGS $BUFSPEC $1
    ORIG="$1"
    shift
    for n
    do
        $WXPASTE $BUFSPEC $ORIG | $WXCOPY $WXCOPY_DEFS $WXARGS $BUFSPEC $n
    done
fi

และนี่คือยาสีฟัน:

#!/bin/sh
#
# Provide some enhancements to the wxpaste command, which pastes from X11
# clipboard text buffers to standard output.
#
# Allow pasting to stdout from any of the cutbuffers.  Note that they are
# indexed counting from 0.
#
# Author: Luke Kendall
#

if [ `uname -s` = "Darwin" ]
then
    WXCOPY=pbcopy
    WXPASTE=pbpaste
else
    WXCOPY=wxcopy
    WXPASTE=wxpaste
    BUFSPEC="-cutbuffer"
    if [ -s $HOME/.wcopyok ]
    then
        : # Great, they're actually working.  Not common on modern Linuxes.
    else
        WXCOPY="xcb -s"
        WXPASTE="xcb -p"
        BUFSPEC=
    fi
fi

if [ $# = 0 ]
then
    $WXPASTE ${WXPASTE_DEFS:-0}
else
    MYNAME=`basename $0`
    USAGE="usage: $MYNAME [ [0-9]... ] [$WXPASTE's args]"
    for n
    do
        if expr "x$n" : 'x[0-9][0-9]*$' > /dev/null
        then
            NUMARGS="$NUMARGS $n"
        elif [ "x$n" = "x-h" ]
        then
            echo "$USAGE" >&2
            exit 0
        else
            WXARGS="$WXARGS $n"
        fi
    done
    set - $NUMARGS
    : echo "Num args: $#"
    for n
    do
        : echo "Doing: $WXPASTE $WXPASTE_DEFS $WXARGS $BUFSPEC $n"
        $WXPASTE $WXPASTE_DEFS $WXARGS $BUFSPEC $n
    done
fi

หากใครสนใจฉันเขียน man page สำหรับสคริปต์ด้วย - แต่คุณอาจพบพวกมัน (พวกมันยังใช้ได้) โดย googling wcopy.1x และ wpaste.1x


คุณสามารถแก้ไขคำตอบของคุณเพื่อเพิ่มไฮเปอร์ลิงก์ไปยัง manpages (คุณควรเพิ่มลิงก์ได้สูงสุด 2 ลิงก์แม้ว่าคุณจะเป็นผู้ใช้ AU คนใหม่)
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.