在Bash中是否可以将内容导入/导出到剪贴板?
无论是将内容导入/导出到设备句柄,还是使用辅助应用程序,我都没有找到任何相关资料。
例如,如果/dev/clip
是指向剪贴板的设备链接,我们可以这样做:
cat /dev/clip # Dump the contents of the clipboard
cat foo > /dev/clip # Dump the contents of "foo" into the clipboard
在Linux中,这是有效的:
cat filename | xclip
alias xclip="xclip -selection c"
。但是 xclip 似乎不需要这个别名,也可以参见 How to pipe text from command line to the clipboard - Super User 在 2010 年的文章。 - questionto42prefix-[
(默认情况下prefix
是 Ctrl +B)访问的复制模式。用于此模式的缓冲区是独立且专属于tmux,这在正确的情况下打开了许多可能性,并使其更加多功能。hjkl
进行移动,使用v/V/C-v
进行字符/行/块选择等。当您选择完成后,按Enter复制并退出该模式。prefix-]
。
X11
的安装似乎都默认带有两个程序:xclip
和xsel
(有点像它也带有startx
和xinit
)。大多数其他答案都提到了xclip
,而我非常喜欢xsel
的简洁性,因此我将介绍xsel
。将标准输入追加到选择中。意味着-i。
随着标准输入的增长,将其附加到选择中。意味着-i。
将标准输入读入选择中。
将选择写入标准输出。
清除选择。覆盖所有输入选项。
请求删除当前选择。这不仅清除了选择,还请求所在程序删除所选内容。覆盖所有输入选项。
操作PRIMARY选择(默认)。
操作SECONDARY选择。
操作CLIPBOARD选择。
这就是您需要知道的全部内容了。对于 PRIMARY
,使用 p
(或不使用任何字符);对于 SECONDARY
,使用 s
;对于 CLIPBOARD
,使用 b
;对于输出,使用 o
。
例如:假设我想要将 TTY 中 foo
的输出复制到一个网页上以进行错误报告。为此,最好从 TTY/X 会话中复制/粘贴。所以问题变成了“我如何从 TTY 访问剪贴板?”
在这个例子中,我们假设 X 会话在显示器 :1
上。
$ foo -v
Error: not a real TTY
details:
blah blah @ 0x0000000040abeaf4
blah blah @ 0x0000000040abeaf8
blah blah @ 0x0000000040abeafc
blah blah @ 0x0000000040abeb00
...
$ foo -v | DISPLAY=:1 xsel -b # copies it into clipboard of display :1
然后我可以像往常一样将其通过 Ctrl + V 粘贴到表单中。
现在假设支持网站上有人给了我一个运行命令来解决问题。它很复杂且很长。
$ DISPLAY=:1 xsel -bo
sudo foo --update --clear-cache --source-list="http://foo-software.com/repository/foo/debian/ubuntu/xenial/164914519191464/sources.txt"
$ $(DISPLAY=:1 xsel -bo)
Password for braden:
UPDATING %%%%%%%%%%%%%%%%%%%%%%% 100.00%
Clearing cache...
Fetching sources...
Reticulating splines...
Watering trees...
Climbing mountains...
Looking advanced...
Done.
$ foo
Thank you for your order. A pizza should arrive at your house in the next 20 minutes. Your total is $6.99
披萨订购似乎是命令行的一个有益用途。
...继续。
如果使用+clipboard
编译(这很重要!检查vim --version
),Vim应该可以访问X PRIMARY
和CLIPBOARD
选择。这两个选择可以从*
和+
寄存器中访问,可以像其他寄存器一样随意写入和读取。
例如:
:%y+ ; copy/yank (y) everything (%) into the CLIPBOARD selection (+)
"+p ; select (") the CLIPBOARD selection (+) and paste/put it
ggVG"+y ; Alternative version of the first example
xsel
技术来解决问题。:r ! xsel -bo ; read (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b ; write (w) to the stdin of (!) `xsel -b`
绑定几个快捷键,你就可以了。
DISPLAY=
。 X应用程序需要DISPLAY
环境变量来确定它们正在与哪个服务器(或者只有一个服务器处理多个会话?)通信。例如,在TTY中尝试DISPLAY=:1 firefox
(或者您的显示ID可能是什么;我的显示ID恰好是:1
)。 - Braden Best:%y+
。 - HankCaxsel
或 xclip
。 - undefineddumpclip | perl -pe "s/monkey/chimp/g;" | pushclip
它包含源代码:cmd_clip.zip
user1@host:~$ mkfifo /tmp/sharedClip
然后在发送终端
user1@host:~$ cat > /tmp/sharedClip
user2@host:~$ cat /tmp/sharedClip
xsel/xclip
进行输入/输出。例如,一端监听以查看是否更改了任何选择,然后自动将其(通过命名的FIFO)传输到另一个脚本,该脚本正在侦听一个或多个管道,将其插入到自己的X选择中。因此,复制文本将自动导致相同的文本出现在其他X会话的选择中。别忘了$DISPLAY
。 - Braden Best从这个帖子中,有一个选项不需要安装任何第三方软件gclip
/xclip
/xsel
。
一个Perl脚本(因为Perl通常已经安装)
use Win32::Clipboard;
print Win32::Clipboard::GetText();
git bash
上工作(cpan
已损坏,无法下载任何内容),也无法在MSYS2
上工作(cpan
尝试了,但表示该操作系统不受支持)。 - Adrian$ pbpaste | python -c "import sys
for line in sys.stdin:
print(f' {line}')" | pbcopy
这不是打字错误。Python需要换行符来执行for循环。我们想要一次性更改这些行以避免在内存中构建额外的数组。
如果您不介意构建额外的数组,请尝试:
$ pbpaste | python -c "import sys; print(''.join([f' {l}' for l in sys.stdin]))" | pbcopy
~/.bashrc
文件中定义了这个别名。alias indent="pbpaste | awk '{print \" \"\$0}' | pbcopy"
indent
时,剪贴板中的任何内容都会被缩进。''.join(f' {l}' for l in sys.stdin)
-- 对于大多数人来说,在 MacOS 上 python
将指向 python2。因此,你可能需要指定 python3
。 - sytechUTF8
规范化为NFC
形式一样,我使用的命令是 python3 -c 'import sys; import unicodedata as __; ___ = ""; [ print(__.normalize("NFC", _), end = ___) for _ in sys.stdin ]'
。这些烦人的反斜杠代表一个字面上的反斜杠'\'
,后面跟着\n
,因为python
喜欢抱怨缩进,这使得使用4个shell一行命令非常不方便。 - undefinedpbpaste
命令。pbpaste | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
echo
之外的任何工具,将剪贴板中的内容粘贴到文件中的方法。
'
替换为'\''
并将结果复制到剪贴板。echo -n '
' > filename.txt
echo -n '带有 '\''单引号'\'' 转义的 "文本" 已复制' > filename.txt
即使复制的文本包含换行符,也可以正常工作。对于 mac,您可以使用以下函数来使用 pbcopy
和 pbpaste
,但是更简单:
将以下内容添加到您的 .bashrc
或 .zshrc
文件中:
clp() {
if [[ -z "$1" ]]
then
# No input - act as paste
pbpaste;
else
# Input exists - act as copy
echo "$1" | pbcopy;
fi
}
复制请使用clp "内容"
,粘贴请使用clp
X选择
(这必然暗示了“剪贴板”和任何有关xclip / xsel的提及),则需要一个活动的X会话(因此需要X服务器)才能首先访问选择。要了解我的意思,请尝试在本地计算机上运行DISPLAY =“” xsel
。它将因无法找到会话“”
而退出错误,并且不会进行与任何X选择的交互。这就是为什么我最初说我不知道根权限如何影响此事的原因:无论有没有根,您都不太可能在服务器环境中找到X选择有用。 - Braden Best
:%y+
命令来复制所有行到 X 的 PRIMARY 剪贴板中,其中 X 代表的是 '+' 寄存器。如果您想要具体指定某些行,请将%
替换为一个范围。但是,这里有三个注意事项:1. 现在,您必须先将文本保存到文件中才能复制它。这与答案中提到的xclip
命令相反。2. 如果您不熟悉 vim,这可能会很繁琐。3. 只有在编译 vim 时启用了特定功能才能执行此操作。如果您安装了 GVim,则默认情况下应该在 vim 的 GUI 和终端实例中启用该功能。 - Braden Bestxclip
。你的回答非常好用。 - HankCa:%y+
这个方法,但没关系,你已经覆盖了所有情况!干得好。 - HankCals
输出的简单解决方案是:ls | xclip -i -selection clipboard
。 - user2585716