Pipe to/from the clipboard in Bash script
是否可以在bash中通过管道与剪贴板进行连接?
无论是通过管道连接到设备手柄还是使用辅助应用程序,我都找不到任何东西。
例如,如果
1 2 | cat /dev/clip # Dump the contents of the clipboard cat foo > /dev/clip # Dump the contents of"foo" into the clipboard |
你可以处理大量的剪贴板。我想你可能是一个Linux用户,想把东西放在X Windows主剪贴板中。通常,您要与之对话的剪贴板有一个实用程序,允许您与之对话。
在x的情况下,有
如果你在Mac OS X上,就有
如果您使用的是Linux终端模式(不是X),那么可以查看
在Windows 10+或Cygwin下,使用
确保您使用的是别名
1 | echo test | xclip |
CtrL+vBkBD
安装
1 2 3 4 5 6 7 8 | # You can install xclip using `apt-get` apt-get install xclip # or `pacman` pacman -S xclip # or `dnf` dnf install xclip |
如果您没有访问
在
1 2 | alias setclip="xclip -selection c" alias getclip="xclip -selection c -o" |
不要忘记使用
在
1 2 | abbr setclip"xclip -selection c" abbr getclip"xclip -selection c -o" |
不要忘记通过重新启动终端以应用更改来重新启动fish实例。
用法您现在可以使用
1 2 3 | $ echo foo | setclip $ getclip foo |
在MacOS上,使用内置的
例如,如果您运行
1 | cat ~/.bashrc | pbcopy |
尝试
1 | xclip - command line interface to X selections (clipboard) |
男人
Debian/Ubuntu/Mint上的XSEL
1 2 3 4 5 6 7 8 9 10 11 | # append to clipboard: cat 'the file with content' | xsel -ib # or type in the happy face :) and ... echo 'the happy face :) and content' | xsel -ib # show clipboard xsel -b # Get more info: man xsel |
安装
1 | sudo apt-get install xsel |
哇,我真不敢相信这个问题有多少答案。我不能说我都试过了,但我试过了前3或4名,没有一个适合我。对我有用的是一个答案,位于一个叫道格的用户写的一条评论中。因为我觉得这很有帮助,我决定在一个答案中重申。
安装xcopy实用程序,当您在终端中时,输入:
拷贝
1 | Thing_you_want_to_copy|xclip -selection c |
粘贴
1 | myvariable=$(xclip -selection clipboard -o) |
我注意到有很多答案推荐了PBPaste和PBcopy。如果您对这些实用程序感兴趣,但由于某些原因,它们在您的repo上不可用,那么您可以始终为xcopy命令创建一个别名,并将其称为pbpaste和pbcopy。
1 2 | alias pbcopy="xclip -selection c" alias pbpaste="xclip -selection clipboard -o" |
那么它看起来是这样的:
1 2 | Thing_you_want_to_copy|pbcopy myvariable=$(pbpaste) |
下面是一个随时可用的bash脚本,用于读取在多个平台上工作的剪贴板。如果添加功能(例如更多平台),请在此处编辑脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/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 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 Linux子系统上,可以使用clip.exe复制到剪贴板。
1 | cat file | clip.exe |
记住使用
在Windows上(使用Cygwin)尝试本条所述的
Linux中有不同的剪贴板;X服务器有一个,窗口管理器可能有另一个,等等。没有标准设备。
哦,是的,在cli上,屏幕程序也有自己的剪贴板,像emacs和vi等其他应用程序一样。
在x中,可以使用xclip。
您可以检查此线程以获取其他可能的答案:http://unix.derkeiler.com/newgroups/comp.unix.shell/2004-07/0919.html
2018答
使用剪贴板CLI。它与MacOS、Windows、Linux、OpenBSD、FreeBSD和Android一起工作,没有任何实际问题。
安装时使用:
然后你可以做
如果您愿意,可以将以下内容放入您的
仅用于MAC:
1 2 | echo"Hello World" | pbcopy pbpaste |
它们位于
在Windows中复制并粘贴到剪贴板(cygwin):
见:
$Eclipse?
削减描述:将命令行工具的输出重定向到Windows剪贴板。然后可以将此文本输出粘贴到其他程序中。参数列表:/是吗?显示此帮助消息。实例:dir clip放置当前目录的副本在Windows剪贴板中列出。clip 还存在getclip(可以使用而不是shift+ins!),putclip(echo oaeuoa putclip.exe将其放入剪辑)
1 | xsel -b |
执行x11的作业,它大部分已安装。在XSEL的手册页中查看一下是值得的。
这是一个简单的python脚本,可以满足您的需要:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/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()) |
将它保存为路径中的某个可执行文件(我将它保存到
1 | echo"Hello World" | clip |
你可以把剪贴板上的内容通过管道传输到其他程序…
1 2 3 4 5 6 7 8 9 | clip | cowsay _____________ < Hello World > ------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || |
单独运行它只会输出剪贴板中的内容。
几年前我写的一些Windows程序。它们允许您转储、推送、附加和打印剪贴板。工作原理如下:
1 | dumpclip | perl -pe"s/monkey/chimp/g;" | pushclip |
它包括源代码:cmd_clip.zip
有两种方法。已经提到的一些方法包括(我认为)tmux、screen、vim、emacs和shell。我不知道emacs或screen,所以我再看另外三个。
TMUX虽然不是X选择,但TMUX具有可通过
要退出此模式,请点击q;要导航,请使用您的
要从这个缓冲区粘贴,请使用
任何
来自XSEL(1X):
Input options
-a, --append
append standard input to the selection. Implies -i.
-f, --follow
append to selection as standard input grows. Implies -i.
-i, --input
read standard input into the selection.
Output options
-o, --output
write the selection to standard output.
Action options
-c, --clear
clear the selection. Overrides all input options.
-d, --delete
Request that the current selection be deleted. This not only clears the selection, but also requests to the program in which the selection resides that the selected contents be deleted. Overrides all input options.
Selection options
-p, --primary
operate on the PRIMARY selection (default).
-s, --secondary
operate on the SECONDARY selection.
-b, --clipboard
operate on the CLIPBOARD selection.
这就是你需要知道的一切。
例如:假设我想从tty复制
对于这个例子,我们假设X会话显示在
1 2 3 4 5 6 7 8 9 | $ 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 |
然后我可以像往常一样把它做成表格。
现在假设支持站点上的某个人给了我一个运行命令来修复问题。它既复杂又长。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ 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 |
比萨饼订购似乎是命令行的有效使用。
…继续前进。
vim如果用
1 2 3 | :%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选项,那么它就不是世界末日。如前一节所述,您只需使用
1 2 | :r ! xsel -bo ; read (r) from the stdout of (!) `xsel -bo` :w ! xsel -b ; write (w) to the stdin of (!) `xsel -b` |
绑上几把钥匙组合,你就可以了。
从这个线程中,有一个选项不需要安装任何
一个Perl脚本(因为通常总是安装Perl)
1 2 | use Win32::Clipboard; print Win32::Clipboard::GetText(); |
如果你和我一样,在没有根权限的Linux服务器上运行,并且没有xclip或gpm,你可以通过使用一个临时文件来解决这个问题。例如:
1 2 3 | $ echo"hello world"> ~/clip $ echo `cat ~/clip` hello world |
在MacOS中使用
如:
更新剪贴板
享受。
还有xclip copyfile。
虽然1年后,我分享了一个稍微不同的解决方案。希望这对某人有用。
昨天我发现自己有一个问题:"如何在不同的用户会话之间共享剪贴板?"。在使用ctrlbaltxkbbf7-ctrlbaltxkbbf8的会话之间切换时,实际上无法粘贴所复制的内容。
基于一个命名管道,我提出了以下快速和肮脏的解决方案。它肯定是非常赤裸裸和原始的,但我发现它是有用的:
1 | user1@host:~$ mkfifo /tmp/sharedClip |
然后在发送终端
1 | user1@host:~$ cat > /tmp/sharedClip |
最后,在接收终端:
1 | user2@host:~$ cat /tmp/sharedClip |
现在,您可以在第一个终端中键入或粘贴任何内容,并且(在点击return之后),它将立即出现在接收终端中,您可以从中任意位置复制/粘贴。
当然,这不仅仅是为了让用户1的剪贴板中的内容在用户2的剪贴板中可用,而是需要额外的一对粘贴和复制单击。