首页 文章

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

提问于
浏览
745

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

无论是进出设备手柄还是使用辅助应用,我都找不到任何东西 .

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

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

23 回答

  • 2

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

    echo test | xclip
    

    Ctrl v === test

  • 34

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

    例如,如果你跑

    cat ~/.bashrc | pbcopy
    

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

  • 8

    有几种方法 . 已经提到的一些方法包括(我认为)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 (有点像 startxxinit 一样) . 大多数其他答案都提到 xclip ,我真的很喜欢 xsel ,因为它的简洁,所以我将覆盖 xsel .

    来自xsel(1x)

    输入选项-a, - append将标准输入附加到选择 . 意思是-i . -f, - follow在标准输入增加时附加到选择 . 意思是-i . -i, - 输入读取标准输入到选择中 . 输出选项-o, - output将选择内容写入标准输出 . 动作选项-c, - 清除选择 . 覆盖所有输入选项 . -d, - delete请求删除当前选择 . 这不仅清除了选择,而且还向选择所在的程序请求删除所选内容 . 覆盖所有输入选项 . 选择选项-p, - primary对PRIMARY选择进行操作(默认) . -s, - secondary在2ndONDARY选择上运行 . -b, - clipboard在CLIPBOARD选择上运行 .

    这就是你需要知道的一切 . p (或什么都没有) PRIMARYs 表示 SECONDARYb 表示 CLIPBOARDo 表示输出 .

    示例:假设我想从TTY复制 foo 的输出并将其粘贴到网页以获取错误报告 . 要做到这一点,最好是复制到TTY / X会话或从TTY / X会话复制 . 那么问题就变成了如何从TTY访问剪贴板?

    对于此示例,我们假设X会话正在显示 :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
    

    然后,我可以按照惯例将其改为表格 .

    现在说支持站点上有人给我一个命令来运行来解决问题 . 这很复杂而且很长 .

    $ 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 选项 . 这两个选项分别可以从 *+ 寄存器访问,并且可以在闲暇时写入和读取,与任何其他寄存器相同 . 例如:

    :%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副本不是世界末日 . 您可以使用上一节中描述的 xsel 技术 .

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

    绑定几个关键的组合,你应该是好的 .

  • 2

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

    cat file | clip.exe
    

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

  • 0

    在Windows上(使用Cygwin)尝试 cat /dev/clipboardecho "foo" > /dev/clipboard ,如this文章中所述 .

  • 10

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

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

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

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

    看到:

    $ clip.exe - ?

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

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

  • 695

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

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

  • 1

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

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

    Copy

    Thing_you_want_to_copy|xclip -selection c
    

    Paste

    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)
    
  • 5

    你're a little ambiguous. I expect you'可能是X内的Linux用户想要把东西放在X PRIMARY 剪贴板中 .

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

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

    如果你're trying to talk to the Mac OS X clipboard, there' s pbcopy .

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

    还有GNU screen,它有一个剪贴板 . 要把东西放在那里,请查看 screen 命令“ readreg ” .

    在Windows / cygwin下,对于较新版本的Windows(至少是Windows 10),请使用 /dev/clipboardclip .

  • 111
    xsel -b
    

    是x11的工作,它主要是已安装 . 在xsel的手册页中查看是值得的 .

  • 5

    虽然> 1年后,我的解决方案略有不同 . 希望这对某人有用 .

    昨天我发现自己的问题:"How to share the clipboard between different user sessions?" . 事实上,当您使用ctrlaltF7 - ctrlaltF8在会话之间切换时,您无法粘贴您复制的内容 .

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

    user1@host:~$ mkfifo /tmp/sharedClip
    

    然后在发送终端

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

    最后,在接收终端:

    user2@host:~$ cat /tmp/sharedClip
    

    现在,您在第一个终端中输入或粘贴任何内容,并且(在点击返回后),它将立即出现在接收终端中,您可以在任何地方再次复制/粘贴 .

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

  • 135

    2018回答

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

    安装它:

    npm install -g clipboard-cli

    那你可以做

    echo foo | clipboard

    如果需要,可以通过在 .bashrc.bash_profile.zshrc 中添加以下内容来为 cb 添加别名:

    alias cb=clipboard

  • 18

    尝试

    xclip

    xclip - command line interface to X selections (clipboard)
    

    man

  • 2

    我几年前写的一些Windows程序 . 它们允许您转储,推送,追加和打印剪贴板 . 它的工作原理如下:

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

    它包括源代码:cmd_clip.zip

  • 8

    仅适用于Mac:

    echo "Hello World" | pbcopy
    pbpaste
    

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

  • 6

    在macOS中使用 pbpaste

    例如:

    更新剪贴板

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

    请享用 .

  • 2

    这是一个随时可用的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

    xsel 在Debian / Ubuntu / Mint上

    # 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
    
  • 3

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

    $ echo "hello world" > ~/clip
    $ echo `cat ~/clip`
    hello world
    
  • 0

    安装

    # 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

    ~/.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
    
  • 9

    还有xclip-copyfile .

  • 215

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

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

    在X中,您可以使用xclip .

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

相关问题