【问题标题】:How can I copy the output of a command directly into my clipboard?如何将命令的输出直接复制到剪贴板?
【发布时间】:2011-07-05 02:19:05
【问题描述】:

如何在使用终端时将命令的输出通过管道传输到剪贴板并粘贴回来?例如:

cat file | clipboard

【问题讨论】:

标签: linux shell unix terminal clipboard


【解决方案1】:

有一种方法可以在不安装xclip/xsel 的情况下使用,如果您没有 sudo 访问权限,这很有用。

你只需要安装vimx,即支持VIM +剪贴板。您可以在大多数发行版中找到它。

将此脚本另存为~/copy_to_clipboard.sh

#!/bin/sh
if [ -z "$1" ]
  then
  str=" "
else
  str=$1
fi

vimx -u NONE -U NONE -N -c "let @a=\".\"" -c "let @*= \"$str\" " -c " put a " -c "sleep 2" -c " q!"

授予执行权限:chmod +x ~/copy_to_clipboard 并调用它:

~/copy_to_clipboard.sh STRING

由于某种原因,您需要设置一个虚拟@a 寄存器并将其粘贴到临时文件中。否则剪贴板寄存器将无法正确设置。 最后丢弃临时 Vim 文件。

你的剪贴板将被设置,你可以用鼠标中键粘贴它

【讨论】:

    【解决方案2】:

    ma​​cOS:

    your_command_which_gives_output | pbcopy
    

    WSL / GNU/Linux(需要 xclip 包)

    your_command_which_gives_output | xclip -sel clip
    

    Windows 上的 Git Bash:

    your_command_which_gives_output | clip
    

    【讨论】:

      【解决方案3】:

      Linux、macOS、Windows (WSL/CYGWIN)

      每个系统都使用自己的工具将剪贴板功能整合到命令行界面 (CLI)。这意味着,例如在 Windows 子系统 Linux (WSL) 上使用 Ubuntu CLI 时,通常的 xclip 解决方案将不起作用。 macOS 也是如此。

      下表概述了不同系统所需的复制/粘贴工具:

      OS Copy Paste
      WSL clip.exe powershell.exe Get-Clipboard
      CYGWIN > /dev/clipboard cat /dev/clipboard
      macOS pbcopy pbpaste
      Linux xclip -sel clip xclip -sel clip -o

      统一.bashrc解决方案

      只需将以下代码放入您的~/.bashrc,即可在所有系统上启用copypaste。该解决方案适用于“普通”Linux 系统(即 Ubuntu、Debian)以及 WSL 和 macOS:

      if grep -q -i microsoft /proc/version; then
        # on WSL: version contains the string "microsoft"
        alias copy="clip.exe"
        alias paste="powershell.exe Get-Clipboard"
      elif grep -q -i cygwin $(uname -a); then
        # on CYGWIN: uname contains the string "cygwin"
        alias copy="/dev/clipboard"
        alias paste="cat /dev/clipboard"
      elif [[ ! -r /proc/version ]]; then
        # on MAC: version is not readable at all
        alias copy="pbcopy"
        alias paste="pbpaste"
      else
        # on "normal" linux
        alias copy="xclip -sel clip"
        alias paste="xclip -sel clip -o"
      fi
      

      在所有系统上的使用

      复制:

      echo "hello world" | copy
      # or for direct file input
      copy < file
      

      粘贴:

      paste > file
      

      【讨论】:

      • 这应该是一个ZSH插件!
      【解决方案4】:

      这里有两个简单的解决方案,每个方法只有两行代码!

      无需安装额外的软件(后者可能带有大量依赖项,其中一些存在潜在的安全问题)

      注意:第二种方法不能在 Debian 中与 nano 编辑器一起使用。

      第一种方法:

      1. sudo printf "\n#$(date)" &gt;&gt; /path/intended_file
        注意:在任何带有前导注释符号 # 的行之前不会损坏任何文件。
      2. 用编辑器打开文件 sudo gedit /path/intended_file 然后将日期复制到编辑器内的剪贴板并粘贴到任何地方。

      第二种方法

      1. 将位于磁盘上任意位置的uniqueFile 文件的内容写入delete.txt 文件:
        sudo find / -iname 'uniqueFile' &gt;&gt; delete.txt
      2. 用文本编辑器打开文件 gedit delete.txt 并将 (Ctrl-C) 突出显示的所需长路径从编辑器复制到剪贴板。或者您也可以使用终端 nano 编辑器(尽管不支持“标准”Ctrl-C)。
      3. 可选的附加步骤:
        如果delete.txt 已经是您的个人日志文件:
        rm delete.txt 要么 mv delete.txt memo-uniqueFile.txt

      【讨论】:

        【解决方案5】:

        2021 答案

        如果您正在寻找“如何将一个命令的输出复制到剪贴板以用于下一个命令?”这一问题的答案。就像我一样,那么这个解决方案非常适合 Mac 用户。

        在我的示例中,我想简单地复制 $ which postgres 的输出,以便将其粘贴到我的下一个命令中。

        我通过将我的第一个命令$ which postgres$ pbcopy 传递来解决了这个问题。

        which postgres | pbcopy
        

        然后我可以简单地 command + V 产生我想要的结果:

        /usr/local/bin/postgres
        

        【讨论】:

          【解决方案6】:

          当我必须复制我的ssh-key 时,我通常会运行此命令:

          cat ~/.ssh/id_rsa.pub | pbcopy
          

          cmd+vctrl+v 其他任何地方。

          【讨论】:

          • 我还发现这在 OS X 上更自然,被赞成的那个:pbcopy &lt; command 不适合我。
          【解决方案7】:

          使用 sudo 权限:

          echo '#!/usr/bin/python3
          # -*- coding: utf-8 -*-
          import sys
          from tkinter import Tk
          r = Tk()
          r.withdraw()
          r.clipboard_clear()
          data = ""
          for i in sys.stdin:
                  data = data + i
          r.clipboard_append(data)
          r.update()
          r.destroy()' | sudo tee /usr/bin/copy > /dev/null
          sudo chmod +x /usr/bin/copy
          

          或者没有 sudo 权限(仅适用于一个用户):

          echo '#!/usr/bin/python3
          # -*- coding: utf-8 -*-
          import sys
          from tkinter import Tk
          r = Tk()
          r.withdraw()
          r.clipboard_clear()
          data = ""
          for i in sys.stdin:
                  data = data + i
          r.clipboard_append(data)
          r.update()
          r.destroy()' > ~/.local/bin/copy
          chmod +x ~/.local/bin/copy
          

          用法:

          echo "hi" | copy
          

          【讨论】:

          • 这看起来很复杂,与使用 xsel 的现有答案相比有什么好处?
          • 你不需要安装任何东西
          • 我想说,与庞大的 python3 框架相比,单个独立的 xsel 二进制文件微不足道。有些人可能已经安装了 xsel,而没有安装 python3。最重要的是,您的 python 脚本依赖于 tkinter,它可能也没有安装。如果这个答案的动机是提供更少依赖的东西,那么我认为它正好相反。
          • 在大多数 linux 系统上已经安装了 python,并且还包含了 tkinter。
          【解决方案8】:

          这是 Arch Linux 用户的绝佳解决方案。用 pacman 安装 xsel,比如:

          sudo pacman -S xsel
          

          在~/.bashrc 文件中创建别名,如:

          alias pbcopy='xsel --clipboard --input'
          alias pbpaste='xsel --clipboard --output'
          

          使用源代码重新加载您的终端:

          source ~/.bashrc
          

          像上面提到的那样使用它:

          cat your_file.txt | pbcopy
          

          fyi,很好的做法是在 ~/.aliases 中查找所有别名并在 .bashrc 文件中调用它

          【讨论】:

            【解决方案9】:

            只是为了涵盖一个边缘情况:) 并且因为问题标题询问(至少现在)如何将命令的输出直接复制到剪贴板。

            我经常发现在命令已经执行后复制它的输出很有用,我不想或不能再次执行该命令。

            对于这种情况,我们可以使用 gdm 或类似的鼠标实用程序并使用鼠标进行选择。 apt-get install gdm 然后右键或 Cntrl+Shift+c 和 Cntrl+Shift+v 组合在终端中复制和粘贴

            或者,这是我的首选方法(因为当您有多个并排的窗格并且您需要选择多行时,鼠标无法在一个窗格内正确选择),使用 tmux 我们可以复制到 tmux 缓冲区使用标准 [ ,空格 ,移动到 select , enter 或者您可以选择代码块。当您在 cli 多路复用器(如 tmux)的一个通道内并且您需要选择一堆文本而不是行号时,这也特别有用(我的 vim 设置呈现行号)

            之后你可以使用命令:

            tmux save-buffer - | xclip -i
            

            您当然可以将其别名为您喜欢的名称或直接在 tmux 配置文件中绑定

            这只是为了给您一个概念性的答案,以在无法再次执行命令时涵盖这种边缘情况。如果您需要更具体的代码示例,请告诉我

            干杯

            【讨论】:

              【解决方案10】:

              在 OS X 上,使用pbcopypbpaste 反方向。

              pbcopy < .ssh/id_rsa.pub
              

              【讨论】:

              • 是的!就像这样的前任:pbcopy &lt; .ssh/id_rsa.pub
              • 不适用于命令输出 - 例如pbcopy &lt; git merge-base master some-branch
              • 您也可以使用 cat,如果您已经使用它:cat file.txt | pbcopy
              • 我知道该评论已有 5 年历史,但如果将来有人偶然发现此问题,要与命令输出一起使用,请执行 git merge-base master some-branch | pbcopy
              • 如果您不想在复制的内容末尾换行:cat file | xargs echo -n | pbcopy
              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

                对于 mac,这是使用命令行复制(到剪贴板)粘贴(从剪贴板)的示例方法

                pwd命令的结果复制到剪贴板

                $ pwd | pbcopy
                

                将剪贴板中的内容用作

                $ cd $(pbpaste)
                

                【讨论】:

                  【解决方案13】:

                  我来自精简的 KDE 背景,无法访问xclipxsel 或其他花哨的东西。我有一个 TCSH Konsole 让事情变得更糟。

                  要求:qdbusklipperxargsbash

                  创建一个 bash 可执行文件foo.sh

                  #!/bin/bash
                  qdbus org.kde.klipper /klipper setClipboardContents "$1" > /dev/null
                  

                  注意:这需要是 bash,因为 TCSH 不支持多行参数。

                  后跟.cshrc 中的 TCSH 别名。

                  alias clipboard xargs -0 /path/to/foo
                  

                  说明:

                  xargs -0 将标准输入管道传输到单个参数中。这个参数被传递给 bash 可执行文件,它使用qdbusklipper 发送“复制到剪贴板”请求。到/dev/null 的管道是为了不将qdbus 返回的换行符打印到控制台。

                  示例用法:

                  ls | clipboard
                  

                  这会将当前文件夹的内容复制到剪贴板。

                  注意:仅用作管道。如果需要复制参数,请直接使用 bash 可执行文件

                  【讨论】:

                    【解决方案14】:

                    根据之前的帖子,我最终得到了以下可以添加到.bashrc 的轻量级别名解决方案:

                    if [ -n "$(type -P xclip)" ]
                    then
                      alias xclip='xclip -selection clipboard'
                      alias clipboard='if [ -p /dev/stdin ]; then xclip -in; fi; xclip -out'
                    fi
                    

                    例子:

                    # Copy
                    $ date | clipboard
                    Sat Dec 29 14:12:57 PST 2018
                    
                    # Paste
                    $ date
                    Sat Dec 29 14:12:57 PST 2018
                    
                    # Chain
                    $ date | clipboard | wc
                       1       6      29
                    

                    【讨论】:

                      【解决方案15】:

                      对于那些在他们的 Windows 系统(称为 Linux 的 Windows 子系统 (WSL))上安装 bash 的用户,尝试 xclip 会出错:

                      Error: Can't open display: (null)
                      

                      相反,请记住 linux 子系统可以访问 Windows 可执行文件。可以像这样使用clip.exe

                      echo hello | clip.exe
                      

                      允许您使用粘贴命令 (ctrl-v)。

                      【讨论】:

                      • 请注意,如果在 windows 上安装了 xserver(如 vcxsvr 或 xming),显示已启动且 xclipboard 正在运行,您实际上可以无缝使用 xclip。
                      【解决方案16】:

                      我为 Linux/OSX/Cygwin 创建了一个工具,它与其他一些工具相似,但略有不同。我称之为cbit can be found in this github gist

                      在这个要点中,我演示了如何使用 Linux、macOS 和 Cygwin 通过命令行进行复制和粘贴。

                      Linux

                      _copy(){
                          cat | xclip -selection clipboard
                      }
                      
                      _paste(){
                          xclip -selection clipboard -o
                      }
                      

                      macOS

                      _copy(){
                          cat | pbcopy
                      }
                      
                      _paste(){
                          pbpaste
                      }
                      

                      赛格温

                      _copy(){
                          cat > /dev/clipboard
                      }
                      
                      _paste(){
                          cat /dev/clipboard
                      }
                      

                      注意:我最初只是想在对Bob Enohp's answer 的评论中提及这一点。但后来我意识到我应该在我的要点中添加一个自述文件。由于 gist 编辑器不提供 Markdown 预览,因此我在此处使用了答案框,并将其复制/粘贴到我的 gist 想法后,“我不妨提交答案。”

                      cb

                      剪贴板的防漏三通

                      此脚本仿照tee(参见man tee)。

                      这就像您的正常复制和粘贴命令,但统一并且能够感知您何时希望它可链接

                      示例

                      复制

                      $ date | cb
                      # clipboard contains: Tue Jan 24 23:00:00 EST 2017
                      

                      粘贴

                      # clipboard retained from the previous block
                      $ cb
                      Tue Jan 24 23:00:00 EST 2017
                      $ cb | cat
                      Tue Jan 24 23:00:00 EST 2017
                      $ cb > foo
                      $ cat foo
                      Tue Jan 24 23:00:00 EST 2017
                      

                      链接

                      $ date | cb | tee updates.log
                      Tue Jan 24 23:11:11 EST 2017
                      $ cat updates.log
                      Tue Jan 24 23:11:11 EST 2017
                      # clipboard contains: Tue Jan 24 23:11:11 EST 2017
                      

                      通过文件重定向复制

                      (按时间顺序,最后演示这个是有意义的)

                      # clipboard retained from the previous block
                      $ cb < foo
                      $ cb
                      Tue Jan 24 23:00:00 EST 2017
                      # note the minutes and seconds changed from 11 back to 00
                      

                      【讨论】:

                      • 这非常适合我将命令输出复制到 macOS 终端中的剪贴板,谢谢!
                      • 一个解决所有问题的方法!非常感谢,在 MacOS 上为我工作 - 我也会在 Linux 上测试它
                      【解决方案17】:

                      将此添加到您的~/.bashrc

                      # Now `cclip' copies and `clipp' pastes'
                      alias cclip='xclip -selection clipboard'
                      alias clipp='xclip -selection clipboard -o'
                      

                      现在可以剪辑p粘贴和c剪辑副本——但您也可以做一些更有趣的事情:

                      clipp | sed 's/^/    /' | cclip
                      

                      ↑ 缩进你的剪贴板;适用于没有堆栈溢出 { } 按钮的网站

                      你可以通过运行这个来添加它:

                      printf "\nalias clipp=\'xclip -selection c -o\'\n" >> ~/.bashrc
                      printf "\nalias cclip=\'xclip -selection c -i\'\n" >> ~/.bashrc
                      

                      【讨论】:

                      • 请举例说明
                      【解决方案18】:

                      在不使用外部工具的情况下,如果是连接服务器查看SSH,这是一个比较简单的命令:

                      从 Windows 7+ 命令提示符:

                      ssh user@server cat /etc/passwd | clip
                      

                      这会将远程文件的内容放入本地剪贴板。

                      (该命令需要为密钥运行 Pageant,否则它会要求您输入密码。)

                      【讨论】:

                      • @AfshinMoazami,标题和问题本身是通用的,只有 unix 系统的标签提示,我的回答涵盖了当您尝试从 unix 服务器获取日期到 Windows 机器时的情况,这可能对未来的读者有用。
                      • 赞成,因为是的,这对只有 Powershell 可以在本地使用的 Windows 管理员很有用(尽管现在 LSW 可以正常工作,我可以直接从 Powershell 进入 bash 并从那里做我的 *nixy 事情)。
                      • 它在 DOS 提示符以及 Windows 10 上的 git bash 上工作,即echo Hello World | clip
                      【解决方案19】:

                      我编写了这个小脚本,它消除了复制/粘贴命令的猜测工作。

                      该脚本的 Linux 版本依赖于您的系统中已安装的 xclip。该脚本称为剪贴板。

                      #!/bin/bash
                      # Linux version
                      # Use this script to pipe in/out of the clipboard
                      #
                      # Usage: someapp | clipboard     # Pipe someapp's output into clipboard
                      #        clipboard | someapp     # Pipe clipboard's content into someapp
                      #
                      
                      if command -v xclip 1>/dev/null; then
                          if [[ -p /dev/stdin ]] ; then
                              # stdin is a pipe
                              # stdin -> clipboard
                              xclip -i -selection clipboard
                          else
                              # stdin is not a pipe
                              # clipboard -> stdout
                              xclip -o -selection clipboard
                          fi
                      else
                          echo "Remember to install xclip"
                      fi
                      

                      脚本的 OS X 版本依赖于所有 Mac 上预装的 pbcopy 和 pbpaste。

                      #!/bin/bash
                      # OS X version
                      # Use this script to pipe in/out of the clipboard
                      #
                      # Usage: someapp | clipboard     # Pipe someapp's output into clipboard
                      #        clipboard | someapp     # Pipe clipboard's content into someapp
                      #
                      
                      if [[ -p /dev/stdin ]] ; then
                          # stdin is a pipe
                          # stdin -> clipboard
                          pbcopy
                      else
                          # stdin is not a pipe
                          # clipboard -> stdout
                          pbpaste
                      fi
                      

                      使用脚本非常简单,因为您只需通过管道输入或输出clipboard,如这两个示例所示。

                      $ cat file | clipboard
                      
                      $ clipboard | less
                      

                      【讨论】:

                      • 我在 Linux 上使用名称 pbcopypbpaste,因此它适用于 Linux 和 OS X。
                      • 要使脚本在 ubuntu 中全局工作: * 将其保存在 ~/.scripts/clipboard * 使其可执行 chmod +x ~/.scripts/clipboard 用于 bash: * 将 export PATH=$PATH:~/.scripts 添加到 ~/.bashrc 的末尾以用于鱼: *将set PATH ~/.scripts $PATH 添加到~/.config/fish/fish.config 如果任何文件或文件夹不存在,只需创建它们。
                      • 您也可以将此脚本包装为函数clipboard(){ ... } 并将其粘贴到.bashrc 中
                      • 这与我制作的非常相似,但我允许像 date | cb | tee -a updates.log 这样的链接。这会将date 命令输出发送到剪贴板并将其传递给tee -a 命令,该命令将其附加到文件中并将其传递给stdout。但这就像“剪贴板的防泄漏 tee”,因为如果您只执行date | cb,您将不会得到任何输出。最后它也可以cb &gt; file.txtgist.github.com/RichardBronosky/…
                      • 一个建议 - 去掉结尾的换行符以避免在粘贴时执行命令(例如,如果复制粘贴路径)。我通过将命令 xclip -i -selection clipboard 修改为 xargs echo -n | xclip -i -selection clipboard 来做到这一点
                      【解决方案20】:

                      我一直想这样做,并找到了一种很好且简单的方法。我写下了完整的程序,以防其他人需要。

                      首先安装一个名为 xclip 的 16 kB 程序:

                      sudo apt-get install xclip
                      

                      然后您可以将输出通过管道传输到 xclip 以复制到剪贴板:

                      cat file | xclip
                      

                      要粘贴您刚刚复制的文本,您应该使用:

                      xclip -o
                      

                      为了简化生活,您可以像我一样在 .bashrc 文件中设置别名:

                      alias "c=xclip"
                      alias "v=xclip -o"
                      

                      要看看这有多么有用,假设我想在一个新的终端窗口中打开我当前的路径(可能还有其他方法,例如 Ctrl+T在某些系统上,但这仅用于说明目的):

                      Terminal 1:
                      pwd | c
                      
                      Terminal 2:
                      cd `v`
                      

                      注意` ` 周围的v。这首先将v 作为命令执行,然后将其替换为cd 以供使用。

                      仅将内容复制到X剪贴板

                      cat file | xclip
                      

                      如果您想粘贴X 应用程序以外的其他位置,请尝试以下操作:

                      cat file | xclip -selection clipboard
                      

                      【讨论】:

                      • "cat file | xclip" 仅将内容复制到“X”剪贴板,如果您想粘贴到“X”应用程序以外的其他位置,请尝试以下操作:“cat file | xclip -选择剪贴板”
                      • 你选择的手柄合适!
                      • 如果想去掉换行符,直接粘贴编辑"pwd | c"的结果,可以做"pwd | tr -d '\n' | xclip -selection c"
                      • 还定义了alias "cs=xclip -selection clipboard"alias "vs=xclip -o -selection clipboard",以便更轻松地从系统剪贴板复制/粘贴
                      • 我不确定,但我收到以下错误Error: Can't open display: (null)@Legend
                      【解决方案21】:

                      我正在使用 Parcellite 和 xsel 将最后提交消息从 git 复制到我的剪贴板管理器(由于某种原因 xclip 不起作用):

                      $ git log -1 --pretty=%B | xsel -i -b
                      

                      【讨论】:

                      • -i 是默认值。我经常使用 xsel -b | sort | uniq -c | sort -rn | xsel -b
                      【解决方案22】:

                      在安装了 xclip 的 Linux 中:

                      xclip -选择剪贴板

                      【讨论】:

                        【解决方案23】:

                        我制作了一个提供类似功能的小工具,但没有使用 xclip 或 xsel。 stdout 被复制到剪贴板,并且可以在终端中再次粘贴。见:

                        https://sourceforge.net/projects/commandlinecopypaste/

                        请注意,此工具不需要 X-session。剪贴板只能在终端中使用,不必通过 Ctrl+V 或鼠标中键粘贴到其他 X 窗口中。

                        【讨论】:

                          猜你喜欢
                          • 2016-04-28
                          • 2018-11-24
                          • 1970-01-01
                          • 1970-01-01
                          • 2010-11-22
                          • 2014-01-31
                          • 1970-01-01
                          • 2021-11-07
                          • 2016-08-25
                          相关资源
                          最近更新 更多