在Bash脚本中管道往返剪贴板

mar*_*cog 879 linux macos bash clipboard

是否可以在Bash中管道进出剪贴板?

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

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

cat /dev/clip        # Dump the contents of the clipboard
cat foo > /dev/clip  # Dump the contents of "foo" into the clipboard
Run Code Online (Sandbox Code Playgroud)

lhu*_*ath 803

你有点暧昧.我希望你可能是X内部想要把东西放在X xclip剪贴板中的Linux用户.

重要的是要了解xclip -selection c没有剪贴板.没有"剪贴板"这样的东西,因为pbcopy可以在Windows,Mac OS X,许多其他操作系统,X内部,X外部运行......更不用说X本身有三个不同的剪贴板.你可以处理很多剪贴板.通常,您要与之交谈的剪贴板具有一个实用程序,可让您与之交谈.

在X的情况下,是的,有gpm(和其他人).screen将数据发送到剪贴板,在大多数应用程序中使用Ctrl-C,Ctrl-V.

如果您正在尝试与Mac OS X剪贴板通信,那就是readreg.

如果您处于Linux终端模式(没有X),那么您可能需要查看/dev/clipboard.

还有GNUclip,它有一个剪贴板.要把东西放在那里,看看xclip命令" xclip -selection c".

在Windows/cygwin下,使用pbcopygpm用于较新版本的Windows(至少Windows 10).

  • 请注意,`xclip -selection c`将在大多数应用程序中将数据发送到与^ C,^ V一起使用的剪贴板 (69认同)
  • cygwin: [/dev/clipboard](http://williammitchell.blogspot.com/2008/03/fun-with-cygwins-devclipboard.html) (34认同)
  • 在较新的Windows版本中,您可以像这样使用`clip`:`dir | clip` (29认同)
  • 在Windows上,`/ dev/clipboard`也适用于Msys/MinGW bash shell (24认同)
  • 令人遗憾的是,GNU/Linux没有像`/ dev/clipboard`这样的设备,并且强制安装xclip,默认情况下至少在Kubuntu*中缺少gpm(我猜大多数其他发行版也是如此)*. (5认同)
  • 在 X11 下,还有 `xsel` 默认对 X 选择进行操作。所以你可以`echo hello | xsel` 或 `xsel|wc` 等等,而不使用命令行开关。 (2认同)

dou*_*oug 261

确保您使用别名,xclip="xclip -selection c" 否则您不能只使用Ctrl+ v将其粘贴到其他位置.

echo test | xclip    
Run Code Online (Sandbox Code Playgroud)

Ctrl+v === test

  • 因为我在osx和linux之间来回走动,所以我的dotfiles中有以下内容.`alias pbcopy ="xclip -selection c"``alias pbpaste ="xclip -selection clipboard -o"`希望有所帮助. (29认同)
  • `xclip -selection clipboard -o` (15认同)
  • @ApockofFork,`xclip`不添加换行符,`echo`是.试试`printf test | xclip -i -selection clipboard`.(`printf`除非你写''test \n'`,否则不会添加换行符.) (13认同)
  • 或者使用`echo -n`代替`printf`. (7认同)

tle*_*leb 169

安装

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

# or `pacman`
pacman -S xclip

# or `dnf`
dnf install xclip
Run Code Online (Sandbox Code Playgroud)

如果您没有访问apt-get,也没有pacman,也没有dnf,来源可在SourceForge上.

建立

巴什

~/.bash_aliases,添加:

alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"
Run Code Online (Sandbox Code Playgroud)

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

~/.config/fish/config.fish,添加:

abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"
Run Code Online (Sandbox Code Playgroud)

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

用法

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

$ echo foo | setclip
$ getclip
foo
Run Code Online (Sandbox Code Playgroud)

  • 对于所有其他发行版:您可以从http://sourceforge.net/projects/xclip/下载源代码 (3认同)

jtr*_*ove 138

在macOS上使用内置pbcopypbpaste命令.

例如,如果你跑

cat ~/.bashrc | pbcopy
Run Code Online (Sandbox Code Playgroud)

~/.bashrc文件的内容可用于使用Cmd+ v快捷键进行粘贴.


Zor*_*che 36

尝试

xclip

xclip - command line interface to X selections (clipboard) 
Run Code Online (Sandbox Code Playgroud)


And*_*510 24

在Debian/Ubuntu/Mint上的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
Run Code Online (Sandbox Code Playgroud)

安装

sudo apt-get install xsel
Run Code Online (Sandbox Code Playgroud)

  • `xsel` 在脚本中运行良好,而 `xclip` 仅在提示符下运行。不知道为什么。 (3认同)

the*_*les 16

哇,我简直不敢相信这个问题有多少答案.我不能说我已经尝试了所有这些,但我已经尝试了前3或者4,但它们都不适合我.对我有用的是一个答案,该答案位于一个名为doug的用户写的评论中.由于我觉得它很有帮助,我决定重新回答一下.

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

复制

Thing_you_want_to_copy|xclip -selection c
Run Code Online (Sandbox Code Playgroud)

myvariable=$(xclip -selection clipboard -o)
Run Code Online (Sandbox Code Playgroud)

我注意到很多答案推荐pbpaste和pbcopy.如果您使用这些实用程序但由于某些原因它们在您的仓库中不可用,您可以随时为xcopy命令创建别名并将其命名为pbpaste和pbcopy.

alias pbcopy="xclip -selection c" 
alias pbpaste="xclip -selection clipboard -o" 
Run Code Online (Sandbox Code Playgroud)

那么它看起来像这样:

Thing_you_want_to_copy|pbcopy
myvariable=$(pbpaste)
Run Code Online (Sandbox Code Playgroud)


Eva*_*rad 14

2018回答

使用clipboard-cli.它适用于macOS,Windows,Linux,OpenBSD,FreeBSD和Android,没有任何实际问题.

安装它:

npm install -g clipboard-cli

那你可以做

echo foo | clipboard

如果你愿意,你可以别名cb通过把你的下面.bashrc,.bash_profile.zshrc:

alias cb=clipboard

  • @Stas,我希望如此,它是由最多产的节点贡献者Sindresorhus(https://github.com/sindresorhus)制作的。他负责Ava测试库,xo linter,Yeoman和无数其他项目。他还负责无数这样的小型图书馆,这些图书馆将他的代码集中存储在互联网上几乎所有使用JS的网站上。这并不是说他不会受到影响;只是对他的回购协议的关注程度和他自己的声誉使得它比大多数随机npm回购协议的可能性要小得多。 (3认同)
  • 您确定这是一个安全的`npm`软件包吗? (2认同)
  • 周围JS太多了 (2认同)

kno*_*wer 12

在Windows子系统上,您可以使用clip.exe将其复制到剪贴板.

cat file | clip.exe
Run Code Online (Sandbox Code Playgroud)

请记住使用|管道命令.而不是>命令,因为那不起作用.


Wol*_*ahl 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
Run Code Online (Sandbox Code Playgroud)


Nor*_*n H 9

在Windows(Cygwin的)尝试 cat /dev/clipboardecho "foo" > /dev/clipboard在提到这个文章.

  • 正如用户@maep 在单独的评论中提到的,较新版本的 Windows(我只能确认 Win10)可以简单地通过管道传输到 `clip`。我正在使用 msysgit 1.9.5 并且这有效。 (2认同)

Sun*_*nov 8

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

哦,是的,在CLI上,屏幕程序也有自己的剪贴板,就像其他一些应用程序一样,如Emacsvi.

在X中,您可以使用xclip.

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

  • 听起来创建/ dev/clip对某人来说是一个很好的项目. (2认同)
  • 我完全知道多个剪贴板。这如何使我的问题难以回答? (2认同)

nyi*_*guy 8

仅适用于Mac:

echo "Hello World" | pbcopy
pbpaste
Run Code Online (Sandbox Code Playgroud)

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


Jen*_*man 7

Wayland上, xcopy 似乎不起作用。请改用wl-clipboard

例如,在Fedora上:

sudo dnf install wl-clipboard

tree | wl-copy

wl-paste > file
Run Code Online (Sandbox Code Playgroud)


小智 7

我刚刚在我的KDE环境中搜索了相同的内容。

请随意使用clipcopyclippaste

关键DE:

> echo "TEST CLIP FROM TERMINAL" | clipcopy
> clippaste
TEST CLIP FROM TERMINAL
Run Code Online (Sandbox Code Playgroud)


小智 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())
Run Code Online (Sandbox Code Playgroud)

将其保存为路径中某处的可执行文件(我将其保存到/usr/local/bin/clip. 您可以通过管道将内容保存到剪贴板...

echo "Hello World" | clip
Run Code Online (Sandbox Code Playgroud)

您可以将剪贴板中的内容通过管道传输到其他程序...

clip | cowsay
 _____________
< Hello World >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Run Code Online (Sandbox Code Playgroud)

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


小智 6

  xsel -b
Run Code Online (Sandbox Code Playgroud)

为 X Window 执行此操作,并且它大部分已经安装。查看xsel的手册页是值得付出努力的。


Ste*_*emo 5

复制并粘贴到Windows中的剪贴板(Cygwin):

看到:

$ clip.exe - ?

CLIP描述:将命令行工具的输出重定向到Windows剪贴板.然后可以将此文本输出粘贴到其他程序中.参数列表:/?显示此帮助消息.示例:DIR | CLIP将当前目录列表的副本放入Windows剪贴板.CLIP <README.TXT将readme.txt中的文本副本放在Windows剪贴板上.

还存在getclip(可以代替shift + ins!),putclip(echo oaeuoa | putclip.exe把它放到剪辑中)


Ser*_*ujo 5

我找到了一个很好的参考:How to target multiple selections with xclip

就我而言,我想将内容粘贴到剪贴板上并查看粘贴的内容,因此我还使用了tee带有文件描述符的命令:

echo "just a test" | tee >(xclip -i -selection clipboard)
Run Code Online (Sandbox Code Playgroud)

>()是过程替换的一种形式。Bash 用文件描述符的路径替换每个文件描述符,该文件描述符连接到括号内的程序的标准输入。

tee命令派生出您的命令,允许您“传输其内容”并在标准输出“stdout”上查看结果。

您还可以创建别名以获取和写入剪贴板,让您可以像在 Mac 上一样使用“pbcopy”和“pbpaste”。就我而言,当我使用Z shell ( zsh) 时,我的别名文件中有这个:

(( $+commands[xclip] )) && {
    alias pbpaste='xclip -i -selection clipboard -o'
    alias pbcopy='xclip -selection clipboard'
}
Run Code Online (Sandbox Code Playgroud)

(( $+command[name] ))Z轴壳测试,如果命令“名”是安装在系统上,然后这两个别名是与分组{}。该&&是一个二进制AND ; 如果 a 则 b,因此如果您有 xclip,则将设置别名。

echo "another test" | tee >(pbcopy)
Run Code Online (Sandbox Code Playgroud)

要获取剪贴板内容,只需键入:

pbpaste | "any-command-you-need-here"
Run Code Online (Sandbox Code Playgroud)


Tob*_*s K 5

在 Linux 中,这是有效的:

cat filename | xclip
Run Code Online (Sandbox Code Playgroud)


Sku*_*las 5

pbcopy 内置于 OS X 中:

复制文件.bash_profile的内容:

cat ~/.bash_profile | pbcopy
Run Code Online (Sandbox Code Playgroud)