如何将命令输出直接复制到剪贴板?

832

当我在终端中使用命令时,如何将其输出导入到剪贴板并在需要时粘贴回来?例如:

cat file | clipboard

可能是管道到/从剪贴板的重复问题。 - Ciro Santilli OurBigBook.com
可能是 http://superuser.com/questions/104981/linux-shell-copy-output-into-clipboard-w-o-using-the-mouse 的重复问题。 - Champ
我刚刚提了一个相关的问题,因为我无法在从Windows的Git Bash登录到Ubuntu时让xclip工作:https://stackoverflow.com/q/60117294/470749 - Ryan
2
将文件内容保存到剪贴板。 apt install xclipcat file | xclip -sel clip - EsmaeelE
25个回答

892

一种方法如下:

  1. 安装 xclip,例如:

    sudo apt-get install xclip

  2. 将输出导入到 xclip 中以复制到剪贴板中:

    cat file | xclip

  3. 将刚刚复制的文本粘贴到 X 应用程序中:

    xclip -o

如果要将其粘贴到其他地方(而不是 X 应用程序中),例如浏览器窗口中的文本区域,请使用:

cat file | xclip -selection clipboard

考虑创建一个别名:

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

为了看到这有多有用,想象一下我想在一个新的终端窗口中打开我的当前路径(可能有其他方法,比如在某些系统上使用Ctrl+T,但这只是为了说明目的)。
Terminal 1:
pwd | c

Terminal 2:
cd `v`

注意在v周围的` `。这将首先执行v作为命令,然后将其替换为cd以使用。
只将内容复制到X剪贴板中。
cat file | xclip

220
"cat file | xclip" 只将内容复制到 'X' 剪贴板中,如果你想要粘贴到除 'X' 应用程序之外的其他地方,请尝试这个命令: "cat file | xclip -selection clipboard"。 - khotyn
10
你选择的用户名很合适! - Matt Joiner
4
如果你希望去除换行符,以便可以直接粘贴和编辑 "pwd | c" 的结果,你可以使用命令 "pwd | tr -d '\n' | xclip -selection c"。 - Anake
25
还要定义别名“cs=xclip -selection clipboard”和“vs=xclip -o -selection clipboard”,以便更轻松地从系统剪贴板复制/粘贴。 - Yibo Yang
13
我不确定,但我遇到了以下错误提示:Error: Can't open display: (null) @Legend。 - alper
显示剩余9条评论

302

在 macOS 上,使用 pbcopy 命令可将内容复制到剪贴板;pbpaste 命令则相反,可以将剪贴板上的内容粘贴。

pbcopy < .ssh/id_rsa.pub

18
是的!就像这样,例如:pbcopy < .ssh/id_rsa.pub - doublejosh
2
不过对于命令输出无效 - 例如 pbcopy < git merge-base master some-branch - Ben
3
如果你已经在使用它,你也可以使用cat:cat file.txt | pbcopy。 - ren.rocks
36
我知道这条评论已经五年了,但以防将来有人偶然看到它,如果要将其用于命令输出,请执行以下操作:git merge-base master some-branch | pbcopy。请注意,此处的翻译并没有改变原文的含义,只是使其更通俗易懂。 - Sam
6
如果您不希望复制的内容末尾有换行符:“cat file | xargs echo -n | pbcopy”。 - HydraHatRack
显示剩余3条评论

111
我已经为Linux/OSX/Cygwin创建了一个类似于其他工具但略有不同的工具。我称其为cb,它可以在这个github gist中找到。
在那个gist中,我演示了如何使用Linux、macOS和Cygwin通过命令行进行复制和粘贴。

Linux

_copy(){
    cat | xclip -selection clipboard
}

_paste(){
    xclip -selection clipboard -o
}

macOS

_copy(){
    cat | pbcopy
}

_paste(){
    pbpaste
}

Cygwin

_copy(){
    cat > /dev/clipboard
}

_paste(){
    cat /dev/clipboard
}

注意:我最初只是想在评论Bob Enohp的答案中提到这个。但后来我意识到我应该向我的要点添加一个README。由于要点编辑器没有提供Markdown预览,我在这里使用了答案框,并在将其复制/粘贴到我的要点后思考,“我不妨提交答案。”如果您想讨论功能/错误,最好在github的要点评论中进行

cb

一个防泄漏的剪贴板tee

此脚本模仿了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

1
这对我来说非常完美,可以将命令输出复制到macOS终端的剪贴板中,谢谢! - Joshua Dyck
一种解决方案,统治所有!非常感谢,对我在MacOS上有效 - 我也会在Linux上测试它。 - patrick.holzer
在Ubuntu 18.04中执行链接示例时,它会挂起。测试显示相同的行为,尝试运行cb --test,它会在链接测试上挂起。 - Pablo Adames
感谢您的反馈@PabloAdames!我在gist上收到了一些关于它在ssh上运行时出现问题的评论。您是在本地Ubuntu 18.04上运行还是在ssh上运行? - Bruno Bronosky
@bruno-bronosky 我发现在本地操作系统Ubuntu 18.04中出现了报告的挂起问题。 - Pablo Adames
显示剩余2条评论

54

我写了这个小脚本,可以避免猜测复制/粘贴命令。

该脚本的Linux版本需要在系统中已安装xclip。该脚本名为clipboard。

#!/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版本依赖于pbcopy和pbpaste,它们预装在所有 Mac 上。

#!/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

4
我在Linux系统中使用pbcopypbpaste命令,这样可以同时适用于Linux和苹果电脑(OS X)。 - StackedCrooked
使脚本在Ubuntu全局工作:
  • 将其保存在~/.scripts/clipboard
  • 使其可执行chmod +x ~/.scripts/clipboard
对于Bash:
  • ~/.bashrc的末尾添加export PATH=$PATH:~/.scripts
对于Fish:
  • ~/.config/fish/fish.config中添加set PATH ~/.scripts $PATH
如果任何文件或文件夹不存在,请创建它们。
- Hockey
2
你还可以将这个脚本封装成一个函数clipboard(){ ... },然后粘贴到.bashrc文件中。 - Sebastian Nowak
这与我制作的那个非常相似,但我允许像 date | cb | tee -a updates.log 这样链接。这将把 date 命令输出发送到剪贴板,并将其传递给 tee -a 命令,该命令将其附加到文件并将其传递给 stdout。但它就像是一个“防泄漏的剪贴板tee”,因为如果你只做 date | cb,你就不会得到任何输出。最后,它还可以执行 cb > file.txt https://gist.github.com/RichardBronosky/56d8f614fab2bacdd8b048fb58d0c0c7 - Bruno Bronosky
一个建议 - 去掉尾随的换行符,以避免在粘贴时执行命令(例如,如果复制粘贴路径)。我通过修改命令 xclip -i -selection clipboardxargs echo -n | xclip -i -selection clipboard 来实现这一点。 - Ivaylo Strandjev
实际上,如果您想要复制到剪贴板的内容是多行的,则上面的命令效果不佳。以下是我修复此问题所做的操作: cat - | perl -pe 'chomp if eof' | xclip -selection clipboard - Ivaylo Strandjev

50

使用.bashrc脚本的本地解决方案

Linux、macOS、Windows(WSL/CYGWIN)

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

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

操作系统 复制 粘贴
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

在所有系统上的使用方法

复制:

# pipe
echo "hello world" | copy

# or for direct file input
copy < file

粘贴:

paste > file

2
这应该是一个 ZSH 插件! - Ivan Gonzalez
这是黄金般的。谢谢! - buckley

27

将以下内容添加到您的~/.bashrc文件中:

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

Now clipp pastes and cclip copies — but you can also do fancier stuff:

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

↑ indents your clipboard; good for sites without stack overflow's { } button

您可以通过运行以下命令来添加:

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

请给出一个使用示例 - Ulf Aslak

20

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

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

$ pwd | pbcopy

使用计算机的粘贴快捷键或像下面这样的命令来使用剪贴板中的内容

$ cd $(pbpaste)

11

macOS:

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

11

如果您正在通过SSH连接到服务器,并且不使用外部工具,这是一个相对简单的命令:

从Windows 7+命令提示符中:

ssh user@server cat /etc/passwd | clip

这将把远程文件的内容复制到您的本地剪贴板。

(此命令需要运行Pageant以获取密钥,否则它会要求您输入密码。)


1
@AfshinMoazami,标题和问题本身都很通用,只有标签提示了Unix系统,而我的答案涵盖了从Unix服务器获取日期到Windows机器的情况,这可能对未来的读者有用。 - d.raev
1
因为是有用的内容,对于仅在本地使用 Powershell 的 Windows 管理员非常实用(虽然现在已经可以直接从 Powershell 轻松进入 bash 并从那里完成 *nixy 任务)。 - flith
它可以在Windows 10的DOS提示符和Git Bash上运行,即echo Hello World | clip - user7154703

8

我正在使用 Parcellite 和 xsel 将最近一次的 git 提交信息复制到我的剪贴板管理器中(由于某些原因,xclip 不起作用):

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

-i is the default. I use a lot for eg xsel -b | sort | uniq -c | sort -rn | xsel -b - Pablo Bianchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接