在Bash脚本中将数据传输到/从剪贴板的管道

1289

在Bash中是否可以将内容导入/导出到剪贴板?

无论是将内容导入/导出到设备句柄,还是使用辅助应用程序,我都没有找到任何相关资料。

例如,如果/dev/clip是指向剪贴板的设备链接,我们可以这样做:

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard

6
我一直在使用 :%y+ 命令来复制所有行到 X 的 PRIMARY 剪贴板中,其中 X 代表的是 '+' 寄存器。如果您想要具体指定某些行,请将 % 替换为一个范围。但是,这里有三个注意事项:1. 现在,您必须先将文本保存到文件中才能复制它。这与答案中提到的 xclip 命令相反。2. 如果您不熟悉 vim,这可能会很繁琐。3. 只有在编译 vim 时启用了特定功能才能执行此操作。如果您安装了 GVim,则默认情况下应该在 vim 的 GUI 和终端实例中启用该功能。 - Braden Best
1
@BradenBest 你应该将此作为答案提交。我在一个 NIX 环境下,无法安装 xclip。你的回答非常好用。 - HankCa
@HankCa 好的,我发布了一个答案。告诉我你的想法。 - Braden Best
@BradenBest 给出了非常全面的答案。虽然我只喜欢 :%y+ 这个方法,但没关系,你已经覆盖了所有情况!干得好。 - HankCa
我对于复制例如ls输出的简单解决方案是:ls | xclip -i -selection clipboard - user2585716
显示剩余2条评论
32个回答

1110

你可能需要处理各种剪贴板。我猜你可能是一个Linux用户,想将内容放入X Windows的主剪贴板中。通常情况下,你想使用的剪贴板会有一个工具让你可以操作它。

在X环境下,有xclip等工具。使用xclip -selection c可以将数据发送到与大多数应用程序中的Ctrl+C, Ctrl+V相对应的剪贴板。

如果你使用的是Mac OS X,则可以使用pbcopy,例如:cat example.txt | pbcopy

如果你处于Linux终端模式(没有X),那么可以尝试使用gpm或者带有剪贴板功能的Screen。尝试使用Screen命令readreg

在Windows 10+或Cygwin下,可以使用/dev/clipboardclip


41
Cygwin: /dev/clipboardCygwin是一个在Windows上运行的类Unix环境。/dev/clipboard是Cygwin提供的特殊文件,它允许用户与Windows剪贴板进行交互。 - glenn jackman
29
在Windows操作系统中,/dev/clipboard在Msys/MinGW bash shell中也可以使用。 - Mihai Rotaru
79
请注意,“xclip -selection c”会将数据发送到剪贴板,可在大多数应用程序中使用^C、^V。 - Klaas van Schelven
35
在更新的 Windows 版本中,您可以像这样使用“clip”:dir | clip - maep
12
很遗憾,GNU/Linux没有像“/dev/clipboard”这样的设备,需要安装xclip或gpm来实现剪贴板功能,而在至少Kubuntu(我猜其他大多数发行版也是如此)中,默认情况下缺少gpm。 - Hi-Angel
显示剩余18条评论

361

确保您正在使用alias xclip="xclip -selection c",否则您将无法使用Ctrl+v进行粘贴操作。

例如: 运行echo -n test | xclip后,Ctrl+v将粘贴test


1
如何在没有该命令参数的情况下进行粘贴? - Jonah
20
这条命令是用于在Linux系统中获取剪贴板中的文本内容。 - doug
44
由于我经常在OSX和Linux之间切换,因此我在我的点文件中添加了以下内容:alias pbcopy="xclip -selection c" alias pbpaste="xclip -selection clipboard -o" 希望这对你有帮助。 - doug
17
@ApockofFork,xclip 没有添加换行符,是 echo 添加了。请尝试使用 printf test | xclip -i -selection clipboard 命令。(printf 不会添加换行符,除非你写成 'test\n')。 - David X
10
可以使用 echo -n 替代 printf - Christian Pietsch
显示剩余4条评论

247

安装

# You can install xclip using `apt-get`
apt-get install xclip

# or `pacman`
pacman -S xclip

# or `dnf`
dnf install xclip

如果您无法使用apt-getpacmandnf,可以在sourceforge上获取源代码。

设置

Bash

~/.bash_aliases中添加:

alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"

不要忘记使用. ~/.bash_aliases加载您的新配置文件,或者重新启动您的个人资料。

Fish

~/.config/fish/config.fish中添加:

abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"

别忘了重新启动终端以便更改生效。

用法

现在您可以使用 setclipgetclip,例如:

$ echo foo | setclip
$ getclip
foo

3
对于所有其他发行版:您可以从http://sourceforge.net/projects/xclip/下载源代码。 - Scz
最佳解决方案!在Arch中,使用“sudo pacman -S xclip”命令。但请注意,“.bashrc”不是最佳位置。我建议最终用户了解有关正确的bashrc、bash_aliases和.profile文件以及bash如何处理每个文件的信息。提示:将其放在“.bash_aliases”文件中。 - eduncan911
1
谢谢 @eduncan911! :) 添加了使用 pacman 软件包管理器的选项,并删除了 .bashrc 建议。我知道 .bash_aliases 更适合,但最终结果是相同的(如果存在,.bashrc 只需需要 .bash_aliases)。如果人们想要一个混乱的系统,就让他们拥有一个。 :) - tleb
1
@jpaugh 你说得对。我的.bashrc在末尾引用了.bash_aliases。;) 我遵循这个古老的约定,它在Arch、Ubuntu/Debian、Raspberry变体、macOS/OSX和Windows Bash上保持100%兼容性:http://stefaanlippens.net/my_bashrc_aliases_profile_and_other_stuff/ 有了这个约定,我可以在所有我接触到的机器上使用完全相同的dotfiles。这非常好:https://github.com/eduncan911/dotfiles - eduncan911
@eduncan911 谢谢!我正在制作自己的dotfiles repo,所以这是一个很好的资源。拥有单独的文件的好处是,您可以通过$PROMPT_COMMAND(比较时间戳)在更改时轻松重新加载.bash_aliases。我已经用自动重新加载的.bashrc的方式完成了这个过程。 - jpaugh
显示剩余2条评论

187
在 macOS 上,可以使用内置的 pbcopypbpaste 命令。
例如,如果运行以下命令:
cat ~/.bashrc | pbcopy

~/.bashrc文件的内容将可使用快捷键Cmd + V粘贴。
要将当前剪贴板保存到文件中,请将输出pbpaste重定向到文件中:
pbpaste > my_clipboard.txt

pbcopy < my_clipboard.txt 也可用于从文件中复制内容。 - Praveen
不错!我通常使用cat my_clipboard.txt | pbcopy将文件内容复制到剪贴板,但pbcopy < my_clipboard.txt更顺畅。 - leifericf
太棒了!通常我会使用cat my_clipboard.txt | pbcopy来将文件内容复制到剪贴板,但是pbcopy < my_clipboard.txt更加顺畅。 - undefined

68

2018年答案

使用clipboard-cli。它可以在 macOS、Windows、Linux、OpenBSD、FreeBSD 和 Android 上无任何问题地使用。

安装方法如下:

npm install -g clipboard-cli

然后你可以执行:

echo foo | clipboard 

如果你想的话,可以在你的.bashrc.bash_profile.zshrc中添加以下内容来将别名设置为cb

alias cb=clipboard

13
你确定这是一个安全的 npm 包吗? - Johnny
13
@Stas,我希望如此,因为这个库是由Sindresorhus (https://github.com/sindresorhus)创建的,他是最活跃的Node贡献者之一。他负责了Ava测试库,xo linter,Yeoman以及无数其他项目。他还负责许多小型库,像这样的库集合将他的代码放在几乎每个使用JS的网站上。这并不是说他不可能被攻击;只是他的仓库得到了很多人的关注,而且他的声誉比大多数随机npm仓库更可靠。 - Evan Conrad
太酷了!在Ubuntu GNU/Linux上工作,但xclip无法使用。 - Kevin Buchs
虽然它在WSL中无法工作——一个在Windows中的Linux。 - Kangqiao Zhao
9
周围的 JavaScript 太多了。 - vatosarmat
显示剩余2条评论

54

xsel在Debian/Ubuntu/Mint上的使用

# append to clipboard:
cat 'the file with content' | xsel -ab

# or type in the happy face :) and ...
echo 'the happy face :) and content' | xsel -ib

# show clipboard
xsel -ob

# Get more info:
man xsel

安装

sudo apt-get install xsel

这与 echo "foo" | xclip -selection c 有何不同? - Léo Léopold Hertz 준영
这个Ask Ubuntu answer上有一些答案,但主要是xselxclip在所有方面都是等效的,除了xclip可以通过名称读写文件,而xsel需要使用shell重定向才能访问文件。 - Colin D Bennett
3
xsel在脚本中表现良好,而xclip仅在提示符下工作。不确定原因。 - NVRM
在基于Redhat的系统上也可以使用。与xclip不同,当用于脚本时不会奇怪地阻塞。 - TNT

43

尝试

xclip

xclip - command line interface to X selections (clipboard) 

man


38

适用于Linux的Windows子系统(WSL)上,您可以使用clip.exe将内容复制到剪贴板:

cat file | clip.exe

记得使用 | 管道命令,而不是 > 命令,因为那样不起作用。


2
这在gitbash中也可以工作。 - Anthony Miller
很遗憾,你不能从中提取东西。 - Adrian

22

安装xcopy实用程序,当您在终端中时,请输入:

Copy

Thing_you_want_to_copy | xclip -selection c

粘贴

myvariable=$(xclip -selection clipboard -o)

我注意到很多答案推荐使用pbpastepbcopy。如果你喜欢这些工具,但是它们在你的软件源中无法使用,你可以为xcopy命令创建别名并将它们称为pbpastepbcopy

alias pbcopy="xclip -selection c"
alias pbpaste="xclip -selection clipboard -o"

那么它看起来就像这样:

Thing_you_want_to_copy | pbcopy
myvariable=$(pbpaste)

我在一个名叫doug的用户的评论中找到了一个对我很有帮助的答案。因为我认为它很有用,所以我决定在回答中重新陈述一遍。


很好,你的别名部分与 MacOS 相当匹配。 - MeadowMuffins

14

以下是可在多个平台上使用的即用型Bash脚本,用于读取剪贴板。

如果您添加了功能(例如更多平台),请在此处编辑脚本。

#!/bin/bash
# WF 2013-10-04
#
# Multi-platform clipboard read access
#
# Supports
#   Mac OS X
#   Git shell / Cygwin (Windows)
#   Linux (e.g., Ubuntu)

#
# Display an error
#
error() {
  echo "error: $1" 1>&2
  exit 1
}

#
# getClipboard
#
function getClipboard() {
 os=`uname`
      case $os in
        # Git Bash  (Windows)
        MINGW32_NT-6.1)
          cat /dev/clipboard;;
        # Mac OS X
        Darwin*)
          pbpaste;;
        # Linux
        Linux*)
          # Works only for the X clipboard - a check that X is running might be due
          xclip -o;;
        *)
          error "unsupported os $os";;
      esac
}

tmp=/tmp/clipboard$$
getClipboard >$tmp
cat $tmp
# Comment out for debugging
rm $tmp

了解“/dev/clipboard”设备真是太好了。谢谢。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接