管道到/从Bash脚本中的剪贴板

是否可以在Bash中管道到/从剪贴板?

无论是管道到/从设备手柄或使用辅助应用程序,我找不到任何东西。

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

cat /dev/clip        # Dump the contents of the clipboardcat foo > /dev/clip  # Dump the contents of "foo" into the clipboard
732520 次浏览

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

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

在X中,您可以使用XClip

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

试试看

xclip

xclip - command line interface to X selections (clipboard)

man

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

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

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

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

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

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

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

在macOS上,使用内置的#0#1命令。

例如,如果你跑

cat ~/.bashrc | pbcopy

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

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

pbpaste > my_clipboard.txt

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

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

见:

$ clip.exe -?
CLIPDescription: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 directorylisting into the Windows clipboard.CLIP < README.TXT   Places a copy of the text from readme.txton to the Windows clipboard.

此外,getclip(它可以用来代替Shift+ins!)和put剪辑(回显oaeuoa|putclip.exe把它放到剪辑中)也存在。

这是一个现成的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>&2exit 1}
## getClipboard#function getClipboard() {os=`uname`case $os in# Git Bash  (Windows)MINGW32_NT-6.1)cat /dev/clipboard;;# Mac OS XDarwin*)pbpaste;;# LinuxLinux*)# Works only for the X clipboard - a check that X is running might be duexclip -o;;*)error "unsupported os $os";;esac}
tmp=/tmp/clipboard$$getClipboard >$tmpcat $tmp# Comment out for debuggingrm $tmp

我几年前写的几个Windows程序。它们允许您转储、推送、附加和打印剪贴板。它的工作原理如下:

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

它包含源代码:cmd_clip.zip

仅适用于Mac:

echo "Hello World" | pbcopypbpaste

它们位于/usr/bin/pbcopy/usr/bin/pbpaste

安装

# You can install xclip using `apt-get`apt-get install xclip
# or `pacman`pacman -S xclip
# or `dnf`dnf install xclip

如果您无法访问apt-getpacmandnf,则可以在源锻造上使用源代码。

设置

Bash

~/.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实例。

用法

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

$ echo foo | setclip$ getclipfoo

这是一个简单的Python脚本,可以满足您的需求:

#!/usr/bin/python
import sys
# Clipboard storageclipboard_file = '/tmp/clipboard.tmp'
if(sys.stdin.isatty()): # Should write clipboard contents out to stdoutwith open(clipboard_file, 'r') as c:sys.stdout.write(c.read())elif(sys.stdout.isatty()): # Should save stdin to clipboardwith 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 |||     ||

运行它本身将简单地输出剪贴板中的内容。

  xsel -b

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

xsel在Debian/Ubuntu/Mint

# 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 clipboardxsel -ob
# Get more info:man xsel

安装

sudo apt-get install xsel

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

$ echo "Hello, World!" > ~/clip$ echo `cat ~/clip`Hello, World!

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

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

user1@host:~$ mkfifo /tmp/sharedClip

然后在发送终端

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

最后,在接收终端:

user2@host:~$ cat /tmp/sharedClip

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

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

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

Tmux

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

要退出此模式,请点击Q;进行导航,使用Vim或Emacs绑定(默认=Vim),因此hjkl用于移动,v/V/C-v用于字符/行/块选择等。

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

壳牌

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

xsel(1x)

输入选项\

-a,--append\

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

-f,--跟随\

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

-i,--输入\

将标准输入读入选择。

输出选项\

-o,--输出

将所选内容写入标准输出。

行动选项\

-c,--清除\

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

-d,--删除

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

选择选项\

-p,--主函数

操作主选择(默认)。

-s,--次要\

操作第二个选择。

-b,--clipboard\

操作剪贴板选择。

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

示例:假设我想从TTY复制foo的输出并将其粘贴到bug报告的网页上。为此,理想的做法是复制到/从TTY/X会话复制。所以问题变成了如何从TTY访问剪贴板?

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

$ foo -vError: not a real TTYdetails:blah blah @ 0x0000000040abeaf4blah blah @ 0x0000000040abeaf8blah blah @ 0x0000000040abeafcblah blah @ 0x0000000040abeb00...$ foo -v | DISPLAY=:1 xsel -b # copies it into clipboard of display :1

然后我可以像往常一样将Ctrl+V转换为形式。

现在假设支持站点上有人给我一个命令来运行以解决问题。它很复杂而且很长。

$ DISPLAY=:1 xsel -bosudo 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.$ fooThank 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应该可以访问XPRIMARYCLIPBOARD选择。这两个选择分别可以从*+寄存器访问,并且可以像任何其他寄存器一样在您的空闲时间写入和读取。

例如:

:%y+    ; copy/yank (y) everything (%) into the CLIPBOARD selection (+)"+p     ; select (") the CLIPBOARD selection (+) and paste/put itggVG"+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`

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

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

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

use Win32::Clipboard;print Win32::Clipboard::GetText();

在macOS中,使用pbpaste

例如:

更新剪贴板

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

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

复制

Thing_you_want_to_copy | xclip -selection c

粘贴

myvariable=$(xclip -selection clipboard -o)

我注意到很多推荐的答案pb糊复印件。如果您喜欢这些实用程序,但由于某种原因它们在您的存储库中不可用,您可以随时为xCopy命令创建别名,并将其称为pbphag和pbCopy。

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

那么它看起来像这样:

Thing_you_want_to_copy | pbcopymyvariable=$(pbpaste)

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

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

cat file | clip.exe

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

2018答案

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

安装它:

npm install -g clipboard-cli

然后你可以做:

echo foo | clipboard

如果需要,您可以将以下内容放在.bashrc.bash_profile.zshrc中,作为cb的别名:

alias cb=clipboard

我找到了一个很好的参考:如何使用XClip定位多个选择

在我的例子中,我想在剪贴板上粘贴内容,并查看粘贴在那里的内容,所以我还使用了带有文件描述符的tee命令:

echo "just a test" | tee >(xclip -i -selection clipboard)

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

tee命令分叉您的命令,允许您“管道其内容”并在标准输出“stdout”上查看结果。

您还可以创建别名以在剪贴板上获取和写入,让您可以像在Mac上一样使用“pbCopy”和“pbsql”。在我的情况下,当我使用z shellzsh)时,我的别名文件中有这个:

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

Z shell中的(( $+command[name] ))测试您的系统上是否安装了命令“name”,然后两个别名都与{}分组。&&是二进制;如果是a,则是b,因此如果您有xclip,则会设置别名。

echo "another test" | tee >(pbcopy)

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

pbpaste | "any-command-you-need-here"

在Linux这是有效的:

cat filename | xclip

PBCopy内置在OS X中:

复制文件.bash_profile的内容:

cat ~/.bash_profile | pbcopy

rubyoneliner启发我尝试使用Python。

假设我们想要一个用四个空格缩进剪贴板中的任何内容的命令。它非常适合在Stack Overflow上共享片段。

$ pbpaste | python -c "import sysfor line in sys.stdin:print(f'    {line}')" | pbcopy

这不是错别字。Python需要换行符来执行进行循环。我们希望在一次传递中更改行以避免在内存中构建额外的数组。

如果您不介意构建额外的数组,请尝试:

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

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

例如,在Fedora上:

sudo dnf install wl-clipboard
tree | wl-copy
wl-paste > file

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

要验证复制粘贴到shell中,然后调用函数clippaste

clippaste () {if [[ $OSTYPE == darwin* ]]thenpbpasteelif [[ $OSTYPE == cygwin* ]]thencat /dev/clipboardelseif command -v xclip &> /dev/nullthenxclip -out -selection clipboardelif command -v xselthenxsel --clipboard --outputelseprint "clipcopy: Platform $OSTYPE not supported or xclip/xsel not installed" >&2return 1fifi}

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

随意使用clipcopyclippaste

KDE:

> echo "TEST CLIP FROM TERMINAL" | clipcopy> clippasteTEST CLIP FROM TERMINAL

一种从剪贴板粘贴到文件的方法,无需任何工具,除了echo

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

基本上你是这样做的:

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

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

对于mac,您可以使用这个使用pbcopypbpaste的函数,但要简单一点:

将其添加到您的.bashrc.zshrc

clp() {if [[ -z "$1" ]]then# No input - act as pastepbpaste;else# Input exists - act as copyecho "$1" | pbcopy;fi}

复制useclp "Content"并粘贴useclp