我正在构建一个命令行工具,以便提高我的一些任务的效率。我需要能够将内容写入剪贴板,但出于某种原因,它对我来说不起作用。
我尝试安装xclip
和xsel
,但两者都有相同的行为:它们可以正常读取/写入剪贴板,但我无法从主 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
的功能。pbcopy
pbpaste
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 找到它们(它们仍然有效)