是否可以在Bash中管道进出剪贴板?
无论是管道设备手柄还是使用辅助应用程序,都找不到任何东西。
例如,如果/dev/clip
是链接到剪贴板的设备,我们可以这样做:
cat /dev/clip # Dump the contents of the clipboard
cat foo > /dev/clip # Dump the contents of "foo" into the clipboard
答案 0 :(得分:741)
你可以处理很多剪贴板。我希望你可能是一个想要把东西放在X Windows主剪贴板中的Linux用户。通常,您要与之交谈的剪贴板都有一个实用程序,可让您与之交谈。
在X的情况下,有xclip
(和其他人)。 xclip -selection c
会将数据发送到剪贴板,该剪贴板在大多数应用程序中都使用Ctrl-C,Ctrl-V。
如果你使用的是Mac OS X,那就是pbcopy
。
如果您处于Linux终端模式(无X),请查看具有剪贴板的gpm
或screen。试试screen
命令readreg
。
在Windows 10+或cygwin下,使用/dev/clipboard
或clip
。
答案 1 :(得分:240)
确保您使用的是别名xclip="xclip -selection c"
否则你不能只使用 Ctrl + v 将其粘贴回另一个地方。
echo test | xclip
Ctrl + v === test
答案 2 :(得分:154)
# You can install xclip using `apt-get`
apt-get install xclip
# or `pacman`
pacman -S xclip
# or `dnf`
dnf install xclip
如果您无法访问apt-get
或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"
不要忘记通过重新启动终端来重新启动fish实例,以便应用更改。
您现在可以使用setclip
和getclip
,例如:
$ echo foo | setclip
$ getclip
foo
答案 3 :(得分:121)
答案 4 :(得分:35)
答案 5 :(得分:22)
xsel
# 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
安装
sudo apt-get install xsel
答案 6 :(得分:13)
安装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)
答案 7 :(得分:11)
这是一个随时可用的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 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
答案 8 :(得分:11)
在适用于Linux的Windows子系统上,您可以使用clip.exe将其复制到剪贴板。
cat file | clip.exe
请记住使用|
管道命令。而不是>
命令,因为这不起作用。
答案 9 :(得分:9)
在Windows上(使用Cygwin)试试
this文章中提到的cat /dev/clipboard
或echo "foo" > /dev/clipboard
。
答案 10 :(得分:9)
Linux中有不同的剪贴板; X服务器有一个,窗口管理器可能有另一个,等等。没有标准设备。
哦,是的,在CLI上,屏幕程序也有自己的剪贴板,像Emacs和vi等其他应用程序一样。
在X中,您可以使用xclip。
您可以查看此主题以获取其他可能的答案: http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html
答案 11 :(得分:8)
仅适用于Mac:
echo "Hello World" | pbcopy
pbpaste
这些位于/usr/bin/pbcopy
和/usr/bin/pbpaste
。
答案 12 :(得分:8)
使用clipboard-cli。它适用于macOS,Windows,Linux,OpenBSD,FreeBSD和Android,没有任何实际问题。
使用以下命令安装:
npm install -g clipboard-cli
然后你可以做
echo foo | clipboard
如果您愿意,可以通过在cb
,.bashrc
或.bash_profile
中添加以下内容来为.zshrc
添加别名:
alias cb=clipboard
答案 13 :(得分:5)
复制并粘贴到Windows中的剪贴板(Cygwin):
请参阅:
$ clip.exe - ?
CLIP 描述: 将命令行工具的输出重定向到Windows剪贴板。 然后可以将此文本输出粘贴到其他程序中。 参数列表: /?显示此帮助消息。 例子: DIR | CLIP放置当前目录的副本 列在Windows剪贴板中。 CLIP&lt; README.TXT从readme.txt中放置文本的副本 在Windows剪贴板上。
还存在getclip(可以代替shift + ins!),putclip(echo oaeuoa | putclip.exe把它放到剪辑中)
答案 14 :(得分:4)
pbcopy内置于OSX:
复制.bash_profile的内容:
cat ~/.bash_profile | pbcopy
答案 15 :(得分:4)
我找到了很好的参考文献:https://unix.stackexchange.com/questions/69111/
就我而言,我想将内容粘贴到剪贴板上并查看粘贴在剪贴板上的内容,因此我还使用了tee
命令和文件描述符:
echo "just a test" | tee >(xclip -i -selection clipboard)
>()
是一种流程替代形式。 bash将每个替换为文件描述符的路径,该文件描述符在括号内连接到程序的标准输入。
tee
命令会分叉您的命令,使您可以“传递其内容”并在标准输出“ stdout”上查看结果
您还可以创建别名以在剪贴板上获取和写入,从而允许您像在MAC上的任何位置一样使用“ pbcopy”和“ pbpaste”。就我而言,当我使用zsh时,我在别名文件中有此文件:
(( $+commands[xclip] )) && {
alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
}
zsh中的(( $+command[name] ))
测试系统上是否安装了命令“名称”,然后两个别名都用{}
分组。 &&
是二进制AND,如果a则为b,因此,如果您具有xclip,则将设置别名。
echo "another test" | tee >(pbcopy)
要获取剪贴板内容,只需键入:
pbpaste | "any-command-you-need-here"
答案 16 :(得分:4)
xsel -b
x11的作业是否已安装。 在xsel的手册页中查看是值得的。
答案 17 :(得分:3)
这是一个简单的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 |
|| ||
单独运行它只会输出剪贴板中的内容。
答案 18 :(得分:2)
有几种方法。提到的一些方法包括(我认为)tmux,screen,vim,emacs和shell。我不知道emacs或屏幕,所以我会去看其他三个。
虽然不是X选择,但tmux具有可通过prefix-[
访问的复制模式(默认情况下prefix
Ctrl + B )。用于此模式的缓冲区是独立的,并且是tmux独有的,这开启了很多可能性,使其在正确的情况下比X选择更加通用。
要退出此模式,请按 q ;要导航,请使用vim
或emacs
绑定(默认= vim),以便hjkl
进行移动,v/V/C-v
进行字符/行/块选择,等等。选择,点击 Enter 复制并退出模式。
要从此缓冲区粘贴,请使用prefix-]
。
默认情况下,X11
的任何安装都会附带两个程序:xclip
和xsel
(有点像startx
和{{1}一样})。大多数其他答案提到xinit
,我真的很喜欢xclip
,因为它简洁,所以我将介绍xsel
。
来自xsel(1x):
输入选项
-a, - append
将标准输入附加到选择。意味着 -i 。
-f, - follow
随着标准输入增长,附加到选择。意味着 -i 。
-i, - input
将标准输入读入选择。
输出选项
-o, - output
将选择写入标准输出。
行动选项
-c, - clear
清除选择。覆盖所有输入选项。
-d, - delete
请求删除当前选择。这不仅清除了选择,而且还请求选择所在的程序删除所选内容。覆盖所有输入选项。
选择选项
-p, - primary
操作PRIMARY选择(默认)。
-s, - secondary
对SECONDARY选择进行操作。
-b, - clipboard
操作CLIPBOARD选项。
这就是你需要知道的一切。 xsel
为p
(或无),PRIMARY
为s
,SECONDARY
为b
,输出为CLIPBOARD
。
示例:说我想从TTY复制o
的输出并将其粘贴到网页上以获取错误报告。要做到这一点,最好复制到TTY / X会话或从TTY / X会话复制。所以问题变成如何从TTY访问剪贴板?
对于此示例,我们假设X会话正在显示foo
。
: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应该可以访问X vim --version
和PRIMARY
选项。这两个选项分别可以从CLIPBOARD
和*
寄存器访问,并且可以在闲暇时写入和读取,与任何其他寄存器相同。例如:
+
但是,如果您的vim副本不直接支持对X选择的访问,那么它不是世界末日。您可以使用上一节中描述的:%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
绑定几个关键的组合,你应该很好。
答案 19 :(得分:2)
在此主题中,有一个选项不需要安装任何gclip
/ xclip
/ xsel
第三方软件。
perl脚本(因为perl通常总是安装)
use Win32::Clipboard;
print Win32::Clipboard::GetText();
答案 20 :(得分:2)
我几年前写过的一些Windows程序。它们允许您转储,推送,追加和打印剪贴板。它的工作原理如下:
dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip
它包含源代码:cmd_clip.zip
答案 21 :(得分:1)
在Wayland xcopy上似乎不起作用,请改用wl-clipboard。 例如在浅顶软呢帽上
sudo dnf install wl-clipboard
tree | wl-copy
wl-paste > file
答案 22 :(得分:1)
红宝石oneliner启发了我尝试使用python。
说,我们想要一个命令,该命令使剪贴板中的任何内容缩进4个空格。非常适合在stackoverflow上共享代码片段。
$ 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
时,剪贴板中的内容都会缩进。
答案 23 :(得分:1)
只是在我的KDE环境中搜索了相同的内容。
随时使用clipcopy
和clippaste
KDE:
> echo "TEST CLIP FROM TERMINAL" | clipcopy
> clippaste
TEST CLIP FROM TERMINAL
答案 24 :(得分:1)
一种除echo
以外没有任何工具的从剪贴板粘贴到文件的方法。
'
替换为'\''
,然后将结果复制到剪贴板。echo -n '
Shift+Insert
' > filename.txt
Enter
基本上,您正在这样做:
echo -n 'copied text with single quotes escaped' > filename.txt
即使复制的文本有新行也可以使用。
答案 25 :(得分:1)
在Linux中,该方法有效:
cat filename | xclip
答案 26 :(得分:1)
使用pbpaste
例如:
更新剪贴板
pbpaste | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
享受。
答案 27 :(得分:1)
如果您像我一样在没有root权限的Linux服务器上运行,并且没有xclip或gpm,您可以通过使用临时文件来解决此问题。例如:
$ echo "hello world" > ~/clip
$ echo `cat ~/clip`
hello world
答案 28 :(得分:0)
虽然> 1年后,我分享了一个略有不同的解决方案。希望这对某些人有用。
昨天我发现自己的问题是:“如何在不同的用户会话之间共享剪贴板?”。在 ctrl alt F7 - ctrl alt F8的会话之间切换时,实际上,你无法粘贴你复制的内容。
我提出了以下 quick&amp; amp;基于命名管道的脏解决方案。它肯定是非常裸露和原始的,但我发现它有用:
user1@host:~$ mkfifo /tmp/sharedClip
然后在发送终端
user1@host:~$ cat > /tmp/sharedClip
最后,在接收终端:
user2@host:~$ cat /tmp/sharedClip
现在,您在第一个终端中键入或粘贴任何内容,并且(在点击 return 之后),它将立即出现在接收终端中,您可以从中随意复制/粘贴任何位置。
当然,这不仅仅是严格地从user1的剪贴板中获取内容,使其在user2的剪贴板中可用,而是需要另外一对Paste&amp;复制点击次数。
答案 29 :(得分:0)
此功能将测试存在的剪贴板并使用它。
要验证复制到您的外壳中的内容,然后调用函数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
}
答案 30 :(得分:0)