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

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

cat file | clipboard
548710 次浏览

这样做的一种方法如下:

  1. 安装xclip,例如:

    sudo apt-get安装xclip

  2. 将输出通过管道传输到xclip以复制到剪贴板:

    cat文件|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

在OS X上,使用pbcopypbpaste则相反。

pbcopy < .ssh/id_rsa.pub

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

该脚本的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和pb粘贴。

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

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

请注意,此工具不需要X会话。剪贴板只能在终端内使用,无需通过ctrl+v或鼠标中键单击粘贴到其他X窗口中。

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

从Windows 7+命令提示符:

ssh user@server cat /etc/passwd | clip

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

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

将其添加到您的~/.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

在安装了XClip的Linux:

xclip-选择剪贴板<文件

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

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

我为Linux /OSX/Cygwin创建了一个工具,它与其他一些类似,但略有独特。我称之为cb它可以在这个github 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

剪贴板上的防漏T恤

此脚本以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

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

Error: Can't open display: (null)

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

echo hello | clip.exe

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

根据历史发文,我最终得到了以下轻量级别名解决方案,可以添加到.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

我来自一个精简的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可执行文件直接

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

很多时候,我发现在命令已经执行之后复制命令的输出很有用,我不想或不能再次执行命令。

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

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

之后,您可以使用命令:

tmux save-buffer - | xclip -i

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

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

干杯

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

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

$ pwd | pbcopy

使用剪贴板中的内容作为

$ cd $(pbpaste)

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

cat ~/.ssh/id_rsa.pub | pbcopy

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

在Wayland上,XCopy似乎不起作用,请改用wl剪贴板。 例如在fedora

sudo dnf install wl-clipboard


tree | wl-copy


wl-paste > file

使用.bashrc脚本的原生解决方案

Linux、macOS、Windows(WSL/CYGWIN)

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

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

os 复制 粘贴
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

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

这是ArchLinux用户的绝佳解决方案。使用Pacman安装xsel,例如:

sudo pacman -S xsel

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

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

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

source ~/.bashrc

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

cat your_file.txt | pbcopy

仅供参考,良好的做法是扫描~/. aliase中的所有别名并在. bashrc文件中调用它

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

2021答案

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

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

我通过将我的第一个命令$ which postgres$ pbcopy管道连接来解决这个问题。

which postgres | pbcopy

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

/usr/local/bin/postgres

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

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

注意:第二种方法没有与Debian中的纳米编辑器一起工作。

第一种方法:

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

第二种方法

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

有一种方法可以在不安装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文件。

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

我创建了一个工具这里

依赖于xclip包