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

时间:2009-04-14 22:06:47

标签: linux bash macos 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

31 个答案:

答案 0 :(得分:741)

你可以处理很多剪贴板。我希望你可能是一个想要把东西放在X Windows主剪贴板中的Linux用户。通常,您要与之交谈的剪贴板都有一个实用程序,可让您与之交谈。

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

如果你使用的是Mac OS X,那就是pbcopy

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

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

答案 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-getpacman,也无法访问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实例,以便应用更改。

用法

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

$ echo foo | setclip
$ getclip
foo

答案 3 :(得分:121)

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

例如,如果你运行

cat ~/.bashrc | pbcopy

~/.bashrc文件的内容可通过Cmd + v快捷方式进行粘贴。

答案 4 :(得分:35)

尝试

xclip

xclip - command line interface to X selections (clipboard) 

man

答案 5 :(得分:22)

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

安装

sudo apt-get install xsel

答案 6 :(得分:13)

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

安装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/clipboardecho "foo" > /dev/clipboard

答案 10 :(得分:9)

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

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

在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)

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

答案 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或屏幕,所以我会去看其他三个。

TMUX

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

要退出此模式,请按 q ;要导航,请使用vimemacs绑定(默认= vim),以便hjkl进行移动,v/V/C-v进行字符/行/块选择,等等。选择,点击 Enter 复制并退出模式。

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

贝壳

默认情况下,X11的任何安装都会附带两个程序:xclipxsel(有点像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选项。

这就是你需要知道的一切。 xselp(或无),PRIMARYsSECONDARYb,输出为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

披萨订购似乎是对命令行的高效使用。

......继续前进。

的Vim

如果使用$ 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 --versionPRIMARY选项。这两个选项分别可以从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环境中搜索了相同的内容。 随时使用clipcopyclippaste

KDE:

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

答案 24 :(得分:1)

一种除echo以外没有任何工具的从剪贴板粘贴到文件的方法。

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

基本上,您正在这样做:

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

即使复制的文本有新行也可以使用。

答案 25 :(得分:1)

在Linux中,该方法有效:

cat filename | xclip

答案 26 :(得分:1)

macOS中的

使用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)

还有xclip-copyfile