关于linux:如何将命令的输出直接复制到我的剪贴板?

How can I copy the output of a command directly into my clipboard?

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

1
cat file | clipboard


我一直想做到这一点,并找到了一个简单易行的方法。我写下了完整的程序,以防万一其他人需要它。

首先安装名为xclip的16 KB程序:

1
sudo apt-get install xclip

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

1
cat file | xclip

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

1
xclip -o

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

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

为了看看它有多有用,想象一下我想在一个新的终端窗口中打开我当前的路径(在某些系统上可能还有其他方法可以像Ctrl + T那样做,但这只是为了说明目的):

1
2
3
4
5
Terminal 1:
pwd | c

Terminal 2:
cd `v`

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

仅将内容复制到X剪贴板

1
cat file | xclip

如果要粘贴除X应用程序以外的其他位置,请尝试以下方法:

1
cat file | xclip -selection clipboard


在OS X上,使用pbcopy; pbpaste走向相反的方向。


我已经为Linux / OSX / Cygwin创建了一个类似于其他一些工具但略微独特的工具。我称之为cb,它可以在这个github gist中找到。

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

Linux的

1
2
3
4
5
6
7
_copy(){
    cat | xclip -selection clipboard
}

_paste(){
    xclip -selection clipboard -o
}

苹果系统

1
2
3
4
5
6
7
_copy(){
    cat | pbcopy
}

_paste(){
    pbpaste
}

Cygwin的

1
2
3
4
5
6
7
_copy(){
    cat > /dev/clipboard
}

_paste(){
    cat /dev/clipboard
}

注意:我原本打算在我对Bob Enohp的回答的评论中提到这一点。但后来我意识到我应该向我的要点添加一个自述文件。由于gist编辑器没有提供Markdown预览,所以我在这里使用了答案框,在复制/粘贴之后我想到了"我不妨提交答案"。

CB

防漏T恤到剪贴板

此脚本以tee(见man tee)为模型。

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

例子

复制

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

1
2
3
4
5
6
7
8
# 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

链接

1
2
3
4
5
$ 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

通过文件重定向复制

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

1
2
3
4
5
# 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


我写了这个小脚本,从复制/粘贴命令中获取猜测。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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,如这两个示例所示。

1
2
3
$ cat file | clipboard

$ clipboard | less


将其添加到~/.bashrc

1
2
3
# 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:

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

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

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

1
2
3
4
5
6
printf"
alias clipp=\'xclip -selection c -o\'
">> ~/.bashrc
printf"
alias cclip=\'xclip -selection c -i\'
">> ~/.bashrc


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

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


如果不使用外部工具,如果要连接到服务器视图SSH,这是一个相对简单的命令:

从Windows 7+命令提示符:

1
ssh user@server cat /etc/passwd | clip

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

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


在安装了xclip的Linux中:

xclip -selection clipboard < file


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

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

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


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

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

例子:

1
2
3
4
5
6
7
8
9
10
11
# 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

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

通常我发现在命令输出已经执行之后复制命令的输出并且我不希望或不能再次执行命令是有用的。

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

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

在此之后,您可以使用以下命令:

tmux save-buffer - | xclip -i

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

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

干杯


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

必需条件:qdbus klipper xargs bash

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

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

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

其次是.cshrc中的TCSH别名。

1
alias clipboard xargs -0 /path/to/foo

说明:

xargs -0将stdin管道化为单个参数。此参数传递给bash可执行文件,该文件可执行文件使用qdbusklipper发送"复制到剪贴板"请求。到/dev/null的管道不会将qdbus返回的换行符打印到控制台。

用法示例:

1
ls | clipboard

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

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


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

1
Error: Can't open display: (null)

相反,回想一下linux子系统可以访问Windows可执行文件。可以像使用clip.exe一样

1
echo hello | clip.exe

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