关于Linux:在Bash脚本中管道往返剪贴板

Pipe to/from the clipboard in Bash script

是否可以在bash中通过管道与剪贴板进行连接?

无论是通过管道连接到设备手柄还是使用辅助应用程序,我都找不到任何东西。

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

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的情况下,有xclip和其他。xclip -selection c将数据发送到剪贴板,在大多数应用程序中使用ctrl-c和ctrl-v。

如果你在Mac OS X上,就有pbcopy

如果您使用的是Linux终端模式(不是X),那么可以查看gpm或屏幕,其中有一个剪贴板。尝试使用screen命令readreg

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


确保您使用的是别名xclip="xclip -selection c"否则,您不能只使用CtrL+v将其粘贴回其他位置。

1
echo test | xclip

CtrL+vBkBD === test


安装

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

如果您没有访问apt-getpacmandnf的权限,则可以在sourceforge上找到这些源。

设立猛击

~/.bash_aliases中,增加:

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

不要忘记使用. ~/.bash_aliases或通过重新启动配置文件来加载新配置。

~/.config/fish/config.fish中,增加:

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

不要忘记通过重新启动终端以应用更改来重新启动fish实例。

用法

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

1
2
3
$ echo foo | setclip
$ getclip
foo


在MacOS上,使用内置的pbcopypbpaste命令。

例如,如果您运行

1
cat ~/.bashrc | pbcopy

~/.bashrc文件的内容可以用Cmdv快捷方式粘贴。


尝试

xclip

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)尝试本条所述的cat /dev/clipboardecho"foo"> /dev/clipboard


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一起工作,没有任何实际问题。

安装时使用:

npm install -g clipboard-cli

然后你可以做

echo foo | clipboard

如果您愿意,可以将以下内容放入您的.bashrc.bash_profile.zshrc中,将其化名为cb

alias cb=clipboard


仅用于MAC:

1
2
echo"Hello World" | pbcopy
pbpaste

它们位于/usr/bin/pbcopy/usr/bin/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())

将它保存为路径中的某个可执行文件(我将它保存到/usr/local/bin/clip)。你可以通过管道输入要保存到剪贴板的内容…

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具有可通过prefix-[访问的复制模式(默认情况下,prefixCtrL+XYKDB)。用于此模式的缓冲区是独立的,并且是TMUX独有的,它打开了相当多的可能性,使其比在正确的情况下的X选择更通用。

要退出此模式,请点击q;要导航,请使用您的vimemacs绑定(默认值=vim),因此,hjkl用于移动,v/V/C-v用于字符/行/块选择等。选择后,点击enter复制并退出模式。

要从这个缓冲区粘贴,请使用prefix-]

壳牌

任何X11的安装默认都有两个程序:xclipxsel(类似于startxxinit的安装方式)。其他大多数答案都提到了xclip,我非常喜欢xsel,因为它的简洁性,所以我将介绍xsel

来自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.

这就是你需要知道的一切。p(或无)用于PRIMARYs用于SECONDARYb用于CLIPBOARDo用于输出。

例如:假设我想从tty复制foo的输出,并将其粘贴到一个网页上,以获取错误报告。要做到这一点,最好是在tty/x会话之间进行复制。所以问题变成了我如何从TTY访问剪贴板?

对于这个例子,我们假设X会话显示在:1上。

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

如果用+clipboard编译(这很重要!检查你的vim --version,vim应该可以访问x PRIMARYCLIPBOARD选项。这两个选项分别可从*+寄存器中访问,您可以在空闲时与任何其他寄存器一样写入和读取。例如:

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选项,那么它就不是世界末日。如前一节所述,您只需使用xsel技术。

1
2
:r ! xsel -bo ; read  (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b  ; write (w) to the stdin of    (!) `xsel -b`

绑上几把钥匙组合,你就可以了。


从这个线程中,有一个选项不需要安装任何gclip/xclip/xsel第三方软件。

一个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中使用pbpaste

如:

更新剪贴板

pbpaste | ruby -ne ' puts"\|" + $_.split( )[1..4].join("\|") ' | pbcopy

享受。


还有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的剪贴板中可用,而是需要额外的一对粘贴和复制单击。