命令行剪贴板访问

命令行剪贴板访问

我正在构建一个命令行工具,以便提高我的一些任务的效率。我需要能够将内容写入剪贴板,但出于某种原因,它对我来说不起作用。

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

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

echo "hello" | xclip

然后如果Ctrl+ Shift+ V,我会得到我原来的剪贴板条目,而不是“hello”。但是,如果我尝试从 中获取内容xclip,它就可以正常工作。

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

答案1

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

尝试

echo "hello" | xclip -selection clipboard

另请参阅

man xclip

有关 xclip 的更多详细信息

答案2

为了方便起见,我创建了一个别名,以模仿Mac OS X 中和xclip的功能。pbcopypbpaste

sudo apt-get install xclip -y

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

nano ~/.bashrc

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

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

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

我的博客文章包含进一步的详细信息。

答案3

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

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

得到输出 FRED。(这是一个人为的例子,因为即使没有最终的 wxpaste 你也可以得到同样的东西,但我认为它能让你感受到你能实现的效果。)

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

几年前,我编写了两个 shell 脚本 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

这是 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 找到它们(它们仍然有效)

相关内容