是否可以在 Bash 中与剪贴板进行管道传输?
无论是与设备手柄之间的管道还是使用辅助应用程序,我都找不到任何东西。
例如,如果/dev/clip
是一个链接到剪贴板的设备,我们可以这样做:
cat /dev/clip # Dump the contents of the clipboard
cat foo > /dev/clip # Dump the contents of "foo" into the clipboard
您可以处理大量的剪贴板。我希望您可能是想要将内容放入 X Windows 主剪贴板的 Linux 用户。通常,您想与之交谈的剪贴板有一个实用程序可以让您与之交谈。
在 X 的情况下,有xclip
(和其他)。xclip -selection c
将数据发送到与Ctrl+ C,Ctrl+V 在大多数应用程序中使用的剪贴板。
如果您使用的是 Mac OS X,则有pbcopy
. 例如,cat example.txt | pbcopy
如果您处于 Linux 终端模式(无 X),请查看具有剪贴板的gpm
屏幕。试试 Screen 命令readreg
。
在 Windows 10+ 或 Cygwin 下,使用/dev/clipboard
或clip
.
确保您正在使用alias xclip="xclip -selection c"
,否则您将无法使用Ctrl+粘贴v。
示例:运行后echo -n test | xclip
,Ctrl+v将粘贴test
# You can install xclip using `apt-get`
apt-get install xclip
# or `pacman`
pacman -S xclip
# or `dnf`
dnf install xclip
如果您无权访问apt-get
nor pacman
,或者dnf
,源代码可在sourceforge上获得。
在~/.bash_aliases
中,添加:
alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"
不要忘记使用. ~/.bash_aliases
或通过重新启动配置文件来加载新配置。
在~/.config/fish/config.fish
中,添加:
abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"
不要忘记通过重新启动终端来重新启动您的鱼实例以应用更改。
您现在可以使用setclip
and getclip
,例如:
$ echo foo | setclip
$ getclip
foo
使用剪贴板-cli。它适用于 macOS、Windows、Linux、OpenBSD、FreeBSD 和 Android,没有任何实际问题。
安装它:
npm install -g clipboard-cli
然后你可以这样做:
echo foo | clipboard
如果你愿意,你可以通过在你的, , 或cb
中加入以下内容来作为别名:.bashrc
.bash_profile
.zshrc
alias cb=clipboard
Debian/Ubuntu/Mint 上的xsel
# 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
安装 xcopy 实用程序,当您在终端中时,输入:
复制
Thing_you_want_to_copy | xclip -selection c
粘贴
myvariable=$(xclip -selection clipboard -o)
我注意到很多答案推荐pbpaste和pbcopy。如果您使用这些实用程序,但由于某种原因它们在您的存储库中不可用,您始终可以为 xcopy 命令创建一个别名并将它们称为 pbpaste 和 pbcopy。
alias pbcopy="xclip -selection c"
alias pbpaste="xclip -selection clipboard -o"
那么它看起来像这样:
Thing_you_want_to_copy | pbcopy
myvariable=$(pbpaste)
一个答案位于一个名为 doug 的用户为我写的评论中。因为我发现它很有帮助,所以我决定在答案中重申。
这是一个现成的 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
在 Windows(使用 Cygwin)上尝试
cat /dev/clipboard
或echo "foo" > /dev/clipboard
如本文所述。
仅适用于 Mac:
echo "Hello World" | pbcopy
pbpaste
这些位于/usr/bin/pbcopy
和/usr/bin/pbpaste
。
Linux 中有不同的剪贴板;X 服务器有一个,窗口管理器可能有另一个,等等。没有标准设备。
哦,是的,在 CLI 上,屏幕程序也有自己的剪贴板,Emacs和vi等其他一些应用程序也有。
在 X 中,您可以使用xclip。
您可以查看此线程以获取其他可能的答案: http ://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html
这是一个简单的 Python 脚本,可以满足您的需要:
#!/usr/bin/python
import sys
# Clipboard storage
clipboard_file = '/tmp/clipboard.tmp'
if(sys.stdin.isatty()): # Should write clipboard contents out to stdout
with open(clipboard_file, 'r') as c:
sys.stdout.write(c.read())
elif(sys.stdout.isatty()): # Should save stdin to clipboard
with open(clipboard_file, 'w') as c:
c.write(sys.stdin.read())
将其保存为路径中某处的可执行文件(我将其保存到/usr/local/bin/clip
. 您可以通过管道输入要保存到剪贴板的内容...
echo "Hello World" | clip
您可以将剪贴板中的内容通过管道传输到其他程序...
clip | cowsay
_____________
< Hello World >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
单独运行它只会输出剪贴板中的内容。
在 Windows (Cygwin) 中复制并粘贴到剪贴板:
看:
$ clip.exe -?
CLIP
Description:
Redirects output of command line tools to the Windows clipboard.
This text output can then be pasted into other programs.
Parameter List:
/? Displays this help message.
Examples:
DIR | CLIP Places a copy of the current directory
listing into the Windows clipboard.
CLIP < README.TXT Places a copy of the text from readme.txt
on to the Windows clipboard.
还存在 getclip(它可以用来代替Shift+ Ins!)和 putclip(echo oaeuoa | putclip.exe 将其放入剪辑)。
xsel -b
为 X Window 做这项工作,而且它大部分已经安装好了。看看xsel的手册页是值得的。
我找到了一个很好的参考:How to target multiple selections with xclip
就我而言,我想将内容粘贴到剪贴板上并查看粘贴的内容,因此我还使用了tee
带有文件描述符的命令:
echo "just a test" | tee >(xclip -i -selection clipboard)
>()
是过程替换的一种形式。Bash 用括号内连接到程序标准输入的文件描述符的路径替换每个。
该tee
命令派生您的命令,允许您“管道其内容”并在标准输出“stdout”上查看结果。
您还可以创建别名以在剪贴板上获取和写入,让您可以像在 Mac 上一样使用“pbcopy”和“pbpaste”。就我而言,当我使用Z shell ( zsh
) 时,我的别名文件中有这个:
(( $+commands[xclip] )) && {
alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
}
in Z shell 测试您的(( $+command[name] ))
系统上是否安装了命令“name”,然后将两个别名与{}
. 是&&
二进制AND ; 如果 a 然后 b,因此如果您有 xclip,则将设置别名。
echo "another test" | tee >(pbcopy)
要获取剪贴板内容,只需键入:
pbpaste | "any-command-you-need-here"
pbcopy 内置在 OS X 中:
复制文件.bash_profile的内容:
cat ~/.bash_profile | pbcopy
有几种方法。已经提到的一些方法包括(我认为)tmux、Screen、Vim、Emacs和 shell。我不知道 Emacs 或 Screen,所以我将介绍其他三个。
虽然不是 X 选择,但 tmux 具有可通过prefix-[
(默认prefix
为Ctrl+ ) 访问的复制模式。B用于此模式的缓冲区是 tmux 的独立和专有的,它开辟了很多可能性,并且在适当的情况下使其比 X 选择更通用。
要退出此模式,请点击Q; 导航,使用你的 Vim 或 Emacs 绑定(默认 = Vim),所以hjkl
对于移动,v/V/C-v
对于字符/行/块选择等。当你有你的选择时,点击Enter复制并退出模式。
要从此缓冲区粘贴,请使用prefix-]
.
默认情况下,任何安装X11
似乎都带有两个程序:xclip
and xsel
(有点像它同时带有startx
and xinit
)。大多数其他答案都提到了xclip
,我真的很喜欢xsel
它的简洁性,所以我将介绍xsel
。
从xsel(1x):
输入选项\
-a,--追加\
将标准输入附加到选择中。暗示-i。
-f,--关注\
随着标准输入的增长附加到选择。暗示-i。
-i,--输入\
将标准输入读入选择。
输出选项\
-o,--输出\
将选择写入标准输出。
行动选项\
-c,--清除\
清除选择。覆盖所有输入选项。
-d,--删除\
请求删除当前选择。这不仅清除了选择,而且还向选择所在的程序请求删除选择的内容。覆盖所有输入选项。
选择选项\
-p,--主\
对 PRIMARY 选择进行操作(默认)。
-s,--二级\
对 SECONDARY 选择进行操作。
-b,--剪贴板\
对剪贴板选择进行操作。
这就是您需要知道的全部内容。p
(或没有) for PRIMARY
, s
for SECONDARY
, b
for CLIPBOARD
, o
for 输出。
示例:假设我想foo
从 TTY 复制输出并将其粘贴到网页以获取错误报告。为此,理想的做法是复制到 TTY/X 会话/从 TTY/X 会话复制。所以问题变成了如何从 TTY 访问剪贴板?
对于这个例子,我们假设 X 会话是 on display :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
如果使用(This is important! Check your )编译vim --version
,Vim 应该可以访问 XPRIMARY
和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
但是,如果您的 Vim 副本不直接支持访问 X 选择,那也不是世界末日。您可以使用xsel
上一节中描述的技术。
:r ! xsel -bo ; read (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b ; write (w) to the stdin of (!) `xsel -b`
绑定几个键组合,你应该很好。
我只是在我的KDE环境中搜索了相同的东西。
随意使用clipcopy
和clippaste
。
KDE:
> echo "TEST CLIP FROM TERMINAL" | clipcopy
> clippaste
TEST CLIP FROM TERMINAL
在 Linux 中这有效:
cat filename | xclip
Ruby oneliner启发了我尝试使用 Python。
假设我们想要一个将剪贴板中的任何内容缩进四个空格的命令。它非常适合在 Stack Overflow 上共享片段。
$ 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
但老实说,awk 比 python 更好。我在我的~/.bashrc
文件中定义了这个别名
alias indent="pbpaste | awk '{print \" \"\$0}' | pbcopy"
现在,当我运行时indent
,剪贴板中的任何内容都会缩进。
我几年前写的一些 Windows 程序。它们允许您转储、推送、附加和打印剪贴板。它是这样工作的:
dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip
它包括源代码:cmd_clip.zip
在这个线程中,有一个选项不需要安装任何gclip
//第三方软件。xclip
xsel
Perl 脚本(因为通常总是安装 Perl)
use Win32::Clipboard;
print Win32::Clipboard::GetText();
在 macOS 中,使用pbpaste
.
例如:
更新剪贴板
pbpaste | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
一种从剪贴板粘贴到文件的方法,除了echo
.
'
with'\''
并将结果复制到剪贴板。echo -n '
' > filename.txt
基本上你正在这样做:
echo -n 'copied "text" with '\''single quotes'\'' escaped' > filename.txt
即使复制的文本有新行,它也可以工作。
昨天我发现自己有一个问题:“如何在不同的用户会话之间共享剪贴板?” . Ctrl当使用+ Alt+ F7- Ctrl+ Alt+在会话之间切换时F8,实际上,您无法粘贴复制的内容。
我提出了以下基于命名管道的快速而肮脏的解决方案。它肯定是非常裸露和原始的,但我发现它很实用:
user1@host:~$ mkfifo /tmp/sharedClip
然后在发送终端
user1@host:~$ cat > /tmp/sharedClip
最后,在接收终端:
user2@host:~$ cat /tmp/sharedClip
现在,您在第一个终端中键入或粘贴任何内容,并且(在点击后Return),它将立即出现在接收终端中,您可以从那里再次复制和粘贴您喜欢的任何地方。
当然,这不仅仅是严格地从 user1 的剪贴板中获取内容以使其在 user2 的剪贴板中可用,而是需要额外的一对粘贴和复制点击。
此函数将测试存在的剪贴板并使用它。
要验证复制粘贴到您的 shell,然后调用该函数clippaste
:
clippaste () {
if [[ $OSTYPE == darwin* ]]
then
pbpaste
elif [[ $OSTYPE == cygwin* ]]
then
cat /dev/clipboard
else
if command -v xclip &> /dev/null
then
xclip -out -selection clipboard
elif command -v xsel
then
xsel --clipboard --output
else
print "clipcopy: Platform $OSTYPE not supported or xclip/xsel not installed" >&2
return 1
fi
fi
}