命令行剪贴板访问


10

我正在构建一个命令行工具,以使某些任务更加高效。我需要能够将内容写入剪贴板,但是由于某种原因,它对我不起作用。

我已经尝试安装xclipxsel,但是两者都具有相同的行为:它们可以很好地读取/写入剪贴板,但是我无法从主Ubuntu GUI访问它。

我也在终端中尝试过...

echo "hello" | xclip

然后,如果是Ctrl+ Shift+ V,我得到的是原始剪贴板条目,而不是“ hello”。但是,如果我尝试从中获取内容xclip,则效果很好。

主要目标是将内容粘贴到Firefox或我正在使用的任何其他基于GUI的程序中。

Answers:


16

好吧,X中有一些不同的剪贴板:)xclip默认情况下,一个复制文本到其中是“选择缓冲区”-通常,您只需用鼠标选择一些文本,然后使用鼠标中键粘贴即可。该缓冲区与可以使用Ctrl-Shift-V粘贴的缓冲区是分开的。

尝试

echo "hello" | xclip -selection clipboard

另外,看

man xclip

有关xclip的更多详细信息


2
仅供参考,也可以缩短为xclip -sel clip。我个人使用,所有的时间
谢尔盖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以模仿Mac OS X 中pbcopyand 的功能pbpaste

sudo apt-get install xclip -y

然后编辑您的~/.bashrc以添加别名:

nano ~/.bashrc

添加以下新行(您可以将它们放在文件末尾):

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

保存并退出,然后打开一个新的shell或运行source ~/.bashrc以使用别名。

我的博客文章包含更多详细信息。


2

我曾经使用过来自windowmaker的实用程序wxcopy和wxpaste,但是最近的Linux版本(或X版本)似乎已经破坏了它们-我怀疑安全性得到了加强,并且尚未进行更新以匹配它们。例如,您可以执行以下操作:

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

获得输出FRED。(这是一个人为的示例,因为如果没有最终的wxpaste,您将得到相同的结果,但是我认为它具有您可以实现的目标。)

但是,您可以使用“ xcb”包实现相同的效果,该包非常轻巧,并且还提供了8个剪贴板的微小(汇总)可视化显示。

几年前,我写了一对wcopy / wpaste的shell脚本,以使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

这是wpaste:

#!/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

如果有人感兴趣,我也为脚本编写了手册页-但是您可以通过搜索wcopy.1x和wpaste.1x来找到它们(它们仍然有效)。


您可以编辑答案以将超链接添加到手册页。(即使您是新澳大利亚用户,您也应该最多可以添加2个链接。)
Eliah Kagan 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.