1163

是否可以在 Bash 中与剪贴板进行管道传输?

无论是与设备手柄之间的管道还是使用辅助应用程序,我都找不到任何东西。

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

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

31 回答 31

1033

您可以处理大量的剪贴板。我希望您可能是想要将内容放入 X Windows 主剪贴板的 Linux 用户。通常,您想与之交谈的剪贴板有一个实用程序可以让您与之交谈。

在 X 的情况下,有xclip(和其他)。xclip -selection c将数据发送到与Ctrl+ CCtrl+V 在大多数应用程序中使用的剪贴板。

如果您使用的是 Mac OS X,则有pbcopy. 例如,cat example.txt | pbcopy

如果您处于 Linux 终端模式(无 X),请查看具有剪贴板的gpm屏幕试试 Screen 命令readreg

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

于 2009-04-15T05:57:40.697 回答
334

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

示例:运行后echo -n test | xclipCtrl+v将粘贴test

于 2010-11-17T19:14:05.137 回答
227

安装

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

# or `pacman`
pacman -S xclip

# or `dnf`
dnf install xclip

如果您无权访问apt-getnor 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"

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

用法

您现在可以使用setclipand getclip,例如:

$ echo foo | setclip
$ getclip
foo
于 2014-12-13T08:32:04.487 回答
167

在 macOS 上,使用内置pbcopypbpaste命令。

例如,如果您运行

cat ~/.bashrc | pbcopy

文件的内容~/.bashrc将可用于粘贴Cmd+V快捷方式。

要将当前剪贴板保存到文件,请将输出重定向pbpaste到文件:

pbpaste > my_clipboard.txt
于 2011-03-05T17:24:38.373 回答
61

2018年答案

使用剪贴板-cli。它适用于 macOS、Windows、Linux、OpenBSD、FreeBSD 和 Android,没有任何实际问题。

安装它:

npm install -g clipboard-cli

然后你可以这样做:

echo foo | clipboard 

如果你愿意,你可以通过在你的, , 或cb中加入以下内容来作为别名:.bashrc.bash_profile.zshrc

alias cb=clipboard
于 2018-04-05T19:13:22.023 回答
46

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
于 2015-08-18T15:14:34.877 回答
43

尝试

xclip

xclip - command line interface to X selections (clipboard) 

男人

于 2009-04-14T22:33:14.057 回答
27

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

cat file | clip.exe

请记住使用|管道命令。而不是>命令,因为那是行不通的。

于 2018-03-28T14:17:41.917 回答
22

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

复制

Thing_you_want_to_copy | xclip -selection c

粘贴

myvariable=$(xclip -selection clipboard -o)

我注意到很多答案推荐pbpastepbcopy。如果您使用这些实用程序,但由于某种原因它们在您的存储库中不可用,您始终可以为 xcopy 命令创建一个别名并将它们称为 pbpaste 和 pbcopy。

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

那么它看起来像这样:

Thing_you_want_to_copy | pbcopy
myvariable=$(pbpaste)

一个答案位于一个名为 doug 的用户为我写的评论中。因为我发现它很有帮助,所以我决定在答案中重申。

于 2017-12-11T06:20:05.967 回答
12

这是一个现成的 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
于 2013-10-04T15:39:22.333 回答
11

在 Windows(使用 Cygwin)上尝试 cat /dev/clipboardecho "foo" > /dev/clipboard如本文所述。

于 2011-05-31T13:33:27.990 回答
11

仅适用于 Mac:

echo "Hello World" | pbcopy
pbpaste

这些位于/usr/bin/pbcopy/usr/bin/pbpaste

于 2014-08-22T18:46:04.360 回答
10

Linux 中有不同的剪贴板;X 服务器有一个,窗口管理器可能有另一个,等等。没有标准设备。

哦,是的,在 CLI 上,屏幕程序也有自己的剪贴板,Emacsvi等其他一些应用程序也有。

在 X 中,您可以使用xclip

您可以查看此线程以获取其他可能的答案: http ://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html

于 2009-04-14T22:12:23.953 回答
6

这是一个简单的 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 |
                ||     ||

单独运行它只会输出剪贴板中的内容。

于 2015-05-06T04:57:25.233 回答
5

在 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 将其放入剪辑)。

于 2013-06-21T05:46:14.647 回答
5
  xsel -b

为 X Window 做这项工作,而且它大部分已经安装好了。看看xsel的手册页是值得的。

于 2015-06-11T21:04:26.930 回答
5

我找到了一个很好的参考: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"
于 2019-08-22T11:03:06.760 回答
5

pbcopy 内置在 OS X 中:

复制文件.bash_profile的内容:

cat ~/.bash_profile | pbcopy
于 2020-01-30T10:15:57.490 回答
4

有几种方法。已经提到的一些方法包括(我认为)tmuxScreenVimEmacs和 shell。我不知道 Emacs 或 Screen,所以我将介绍其他三个。

多路复用器

虽然不是 X 选择,但 tmux 具有可通过prefix-[(默认prefixCtrl+ ) 访问的复制模式。B用于此模式的缓冲区是 tmux 的独立和专有的,它开辟了很多可能性,并且在适当的情况下使其比 X 选择更通用。

要退出此模式,请点击Q; 导航,使用你的 Vim 或 Emacs 绑定(默认 = Vim),所以hjkl对于移动,v/V/C-v对于字符/行/块选择等。当你有你的选择时,点击Enter复制并退出模式。

要从此缓冲区粘贴,请使用prefix-].

贝壳

默认情况下,任何安装X11似乎都带有两个程序:xclipand xsel(有点像它同时带有startxand xinit)。大多数其他答案都提到了xclip,我真的很喜欢xsel它的简洁性,所以我将介绍xsel

xsel(1x)

输入选项\

-a,--追加\

将标准输入附加到选择中。暗示-i

-f,--关注\

随着标准输入的增长附加到选择。暗示-i

-i,--输入\

将标准输入读入选择。

输出选项\

-o,--输出\

将选择写入标准输出。

行动选项\

-c,--清除\

清除选择。覆盖所有输入选项。

-d,--删除\

请求删除当前选择。这不仅清除了选择,而且还向选择所在的程序请求删除选择的内容。覆盖所有输入选项。

选择选项\

-p,--主\

对 PRIMARY 选择进行操作(默认)。

-s,--二级\

对 SECONDARY 选择进行操作。

-b,--剪贴板\

对剪贴板选择进行操作。

这就是您需要知道的全部内容。p(或没有) for PRIMARY, sfor SECONDARY, bfor CLIPBOARD, ofor 输出。

示例:假设我想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 应该可以访问 XPRIMARYCLIPBOARD选择项。这两个选项可分别从*+寄存器访问,并且可以像任何其他寄存器一样在您空闲时写入和读取。

例如:

:%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`

绑定几个键组合,你应该很好。

于 2017-05-11T04:00:18.777 回答
4

我只是在我的KDE环境中搜索了相同的东西。

随意使用clipcopyclippaste

KDE:

> echo "TEST CLIP FROM TERMINAL" | clipcopy
> clippaste
TEST CLIP FROM TERMINAL
于 2020-10-21T13:19:06.933 回答
3

在 Linux 中这有效:

cat filename | xclip
于 2020-01-28T22:43:58.633 回答
3

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,剪贴板中的任何内容都会缩进。

于 2020-04-17T07:03:40.707 回答
2

我几年前写的一些 Windows 程序。它们允许您转储、推送、附加和打印剪贴板。它是这样工作的:

dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip

它包括源代码:cmd_clip.zip

于 2014-06-08T14:38:16.903 回答
2

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

Perl 脚本(因为通常总是安装 Perl)

use Win32::Clipboard;
print Win32::Clipboard::GetText();
于 2017-09-23T00:24:32.900 回答
1

在 macOS 中,使用pbpaste.

例如:

更新剪贴板

pbpaste  | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
于 2017-11-02T06:37:06.973 回答
1

Wayland上, xcopy 似乎不起作用。请改用wl 剪贴板

例如,在Fedora上:

sudo dnf install wl-clipboard

tree | wl-copy

wl-paste > file
于 2020-04-29T12:37:06.133 回答
1

一种从剪贴板粘贴到文件的方法,除了echo.

  1. 在要粘贴的文本中转义单引号:替换所有出现的'with'\''并将结果复制到剪贴板。
  2. 类型echo -n '
  3. Shift+Insert
  4. 类型' > filename.txt
  5. Enter

基本上你正在这样做:

echo -n 'copied "text" with '\''single quotes'\'' escaped' > filename.txt

即使复制的文本有新行,它也可以工作。

于 2020-11-25T03:14:00.377 回答
0

如果您像我一样在没有 root 权限的 Linux 服务器上运行并且没有任何xclipGPM,您可以通过使用临时文件来解决此问题。例如:

$ echo "Hello, World!" > ~/clip
$ echo `cat ~/clip`
Hello, World!
于 2015-09-17T17:48:49.563 回答
0

还有xclip-copyfile

于 2016-08-29T11:33:04.330 回答
0

昨天我发现自己有一个问题:“如何在不同的用户会话之间共享剪贴板?” . Ctrl当使用+ Alt+ F7- Ctrl+ Alt+在会话之间切换时F8,实际上,您无法粘贴复制的内容。

我提出了以下基于命名管道的快速而肮脏的解决方案。它肯定是非常裸露和原始的,但我发现它很实用:

user1@host:~$ mkfifo /tmp/sharedClip

然后在发送终端

user1@host:~$ cat > /tmp/sharedClip

最后,在接收终端:

user2@host:~$ cat /tmp/sharedClip

现在,您在第一个终端中键入或粘贴任何内容,并且(在点击后Return),它将立即出现在接收终端中,您可以从那里再次复制和粘贴您喜欢的任何地方。

当然,这不仅仅是严格地从 user1 的剪贴板中获取内容以使其在 user2 的剪贴板中可用,而是需要额​​外的一对粘贴和复制点击。

于 2016-10-07T12:29:36.977 回答
0

此函数将测试存在的剪贴板并使用它。

要验证复制粘贴到您的 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
}
于 2020-09-17T02:35:22.647 回答