How can I pipe the output of a command into my clipboard and paste it back 开发者_如何学Pythonwhen using a terminal? For instance:
cat file | clipboard
One way of doing it follows:
Install
xclip
, such as:sudo apt-get install xclip
Pipe the output into
xclip
to be copied into the clipboard:cat file | xclip
Paste the text you just copied into a
X
application:xclip -o
To paste somewhere else other than an X
application, such as a text area of a web page in a browser window, use:
cat file | xclip -selection clipboard
Consider creating an alias:
alias "c=xclip"
alias "v=xclip -o"
To see how useful this is, imagine I want to open my current path in a new terminal window (there may be other ways of doing it like Ctrl+T on some systems, but this is just for illustration purposes):
Terminal 1:
pwd | c
Terminal 2:
cd `v`
Notice the ` `
around v
. This executes v
as a command first and then substitutes it in-place for cd
to use.
Only copy the content to the X
clipboard
cat file | xclip
On OS X, use pbcopy
; pbpaste
goes in the opposite direction.
pbcopy < .ssh/id_rsa.pub
I've created a tool for Linux/OSX/Cygwin that is similar to some of these others but slightly unique. I call it cb
and it can be found in this github gist.
In that gist I demonstrate how to do copy and paste via commandline using Linux, macOS, and 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
}
Note: I originally just intended to mention this in my comment to Bob Enohp's answer. But then I realized that I should add a README to my gist. Since the gist editor doesn't offer a Markdown preview I used the answer box here and after copy/pasting it to my gist thought, "I might as well submit the answer." If you would like to discuss functionality/bugs it would probably be best to do that in the comments for the gist on github.
cb
A leak-proof tee to the clipboard
This script is modeled after tee
(see man tee
).
It's like your normal copy and paste commands, but unified and able to sense when you want it to be chainable
Examples
Copy
$ date | cb
# clipboard contains: Tue Jan 24 23:00:00 EST 2017
Paste
# 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
Chaining
$ 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
Copy via file redirect
(chronologically it made sense to demo this at the end)
# 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
I wrote this little script that takes the guess work out of the copy/paste commands.
The Linux version of the script relies on xclip being already installed in your system. The script is called 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
The OS X version of the script relies on pbcopy and pbpaste which are preinstalled on all Macs.
#!/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
Using the script is very simple since you simply pipe in or out of clipboard
as shown in these two examples.
$ cat file | clipboard
$ clipboard | less
Native Solution with .bashrc
Script
Linux, macOS, Windows (WSL/CYGWIN)
Each of those systems use its own tool to incorporate the clipboard functionality into the command line interface (CLI). This means, when using for example the Ubuntu CLI on Windows Subsystem for Linux (WSL) the usual xclip
solution won't work. The same holds true for macOS.
The following table provides an overview for the copy/paste tools needed on the different systems:
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 |
Unified .bashrc
Solution
Just put the following code into your ~/.bashrc
to enable the usage of copy
and paste
on all systems. The solution works on "normal" Linux systems (i.e. Ubuntu, Debian) as well as on WSL and 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
Usage on ALL systems
To copy:
# pipe
echo "hello world" | copy
# or for direct file input
copy < file
To paste:
paste > file
Add this to to your ~/.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
You can add it by running this:
printf "\nalias clipp=\'xclip -selection c -o\'\n" >> ~/.bashrc
printf "\nalias cclip=\'xclip -selection c -i\'\n" >> ~/.bashrc
For mac this is an example way to copy (into clipboard) paste (from clipboard) using command line
Copy the result of pwd
command to clipboard as
$ pwd | pbcopy
Use the content in the clipboard by your machine's shortcut for paste or in a command as in below
$ cd $(pbpaste)
Without using external tools, if you are connecting to the server view SSH, this is a relatively easy command:
From a Windows 7+ command prompt:
ssh user@server cat /etc/passwd | clip
This will put the content of the remote file to your local clipboard.
(The command requires running Pageant for the key, or it will ask you for a password.)
I am using Parcellite and xsel
to copy last commit message from git
to my clipboard manager (for some reason xclip
does not work):
$ git log -1 --pretty=%B | xsel -i -b
macOS:
your_command_which_gives_output | pbcopy
WSL / GNU/Linux (requires the xclip package):
your_command_which_gives_output | xclip -sel clip
Git Bash on Windows:
your_command_which_gives_output | clip
I usually run this command when I have to copy my ssh-key
:
cat ~/.ssh/id_rsa.pub | pbcopy
cmd+v
or ctrl+v
anywhere else.
For those using bash installed on their windows system (known as Windows Subsystem for Linux (WSL)), attempting xclip will give an error:
Error: Can't open display: (null)
Instead, recall that linux subsystem has access to windows executables. It's possible to use clip.exe like
echo hello | clip.exe
which allows you to use the paste command (ctrl-v).
on Wayland xcopy doesn't seem to work, use wl-clipboard instead. e.g. on fedora
sudo dnf install wl-clipboard
tree | wl-copy
wl-paste > file
I made a small tool providing similar functionality, without using xclip or xsel. stdout
is copied to a clipboard and can be pasted again in the terminal. See:
https://sourceforge.net/projects/commandlinecopypaste/
Note, that this tool does not need an X-session. The clipboard can just be used within the terminal and has not to be pasted by Ctrl+V or middle-mouse-click into other X-windows.
In Linux with xclip installed:
xclip -selection clipboard < file
I come from a stripped down KDE background and do not have access to xclip
, xsel
or the other fancy stuff. I have a TCSH Konsole to make matters worse.
Requisites: qdbus
klipper
xargs
bash
Create a bash executable foo.sh
.
#!/bin/bash
qdbus org.kde.klipper /klipper setClipboardContents "$1" > /dev/null
Note: This needs to be bash as TCSH does not support multi-line arguments.
Followed by a TCSH alias in the.cshrc
.
alias clipboard xargs -0 /path/to/foo
Explanation:
xargs -0
pipes stdin into a single argument. This argument is passed to the bash executable which sends a "copy to clipboard" request to klipper
using qdbus
. The pipe to /dev/null
is to not print the newline character returned by qdbus
to the console.
Example Usage:
ls | clipboard
This copies the contents of the current folder into the clipboard.
Note: Only works as a pipe. Use the bash executable directly if you need to copy an argument.
Based on previous posts, I ended up with the following light-weigh alias solution that can be added to .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
Examples:
# 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
2021 Answer
If you were searching for an answer to the question, "How do I copy the output of one command into my clipboard to use for my next command?" like I was, then this solution works great as a Mac user.
In my example, I wanted to simply copy the output of $ which postgres
so I could simply paste it in my next command.
I solved this by piping my first command $ which postgres
with $ pbcopy
.
which postgres | pbcopy
Then I could simply command + V which produced my desired result:
/usr/local/bin/postgres
Just to cover an edge case:) and because the question title asks (at least now) how to copy the output of a command directly to clipboard.
Often times I find it useful to copy the output of the command after it was already executed and I don’t want to or can’t execute the command again.
For this scenario, we can either use gdm or a similar mouse utility and select using the mouse. apt-get install gdm
and then either the right click or the Cntrl+Shift+c and Cntrl+Shift+v combinations for copy and paste in the terminal
Or, which is the preferred method for me (as the mouse cannot select properly inside one pane when you have multiple panes side by side and you need to select more than one line), using tmux we can copy into the tmux buffer using the standard [ , space , move to select , enter or you can select a block of code. Also this is particularly useful when you are inside one of the lanes of the cli multiplexer like tmux AND you need to select a bunch of text, but not the line numbers (my vim setup renders line numbers)
After this you can use the command:
tmux save-buffer - | xclip -i
You can of course alias it to something you like or bind directly in the tmux configuration file
This is just to give you a conceptual answer to cover this edge case when it’s not possible to execute the command again. If you need more specific code examples, let me know
Cheers
Here's great solution for Arch Linux users. Install xsel with pacman, like:
sudo pacman -S xsel
Create alias in ~/.bashrc file, like:
alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'
reload your terminal with source:
source ~/.bashrc
use it like mentions above:
cat your_file.txt | pbcopy
fyi, good practice stroing all of the aliases in ~/.aliases and call it in .bashrc file
With sudo privileges:
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
Alternatively without sudo privileges (only for one user):
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
Usage:
echo "hi" | copy
There is a method that works without installing xclip
/xsel
, usefull if you don't have sudo access.
You just need vimx
installed, that is VIM +clipboard support. You can find it in most distros.
Save this script as ~/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!"
give execution permission: chmod +x ~/copy_to_clipboard
and call it with:
~/copy_to_clipboard.sh STRING
For some reason, you need to set a dummy @a
register and paste it on temporary file. Otherwise clipboard register will not be set correctly.
In the end discard temporary Vim file.
Your clipboard will be set, you can paste it with mouse middle-click
I Created a tool Here
depends on xclip package
Here are two simple solutions with only two lines of code in each method!
No need to install additional software (and the latter may come with tons of dependencies, some of which having potentially security problems)
Note: 2nd method does not work with nano editor in Debian.
1st method:
sudo printf "\n#$(date)" >> /path/intended_file
Note: Preceeding any line with leading comment sign#
does not damage any file.- Open file with editor
sudo gedit /path/intended_file
then copy Date to clipboard inside the editor and paste it to anywhere.
2nd Method
- Write content of a
uniqueFile
file located anywhere on disk to adelete.txt
file:
sudo find / -iname 'uniqueFile' >> delete.txt
- Open file with text editor
gedit delete.txt
and copy (Ctrl-C) the highlighted desired long-long path to the clipboard from the editor. Or you can use terminal nano editor too (although does not support the "standard" Ctrl-C). - Optional additional step:
Ifdelete.txt
is already your personal log file:
rm delete.txt
ormv delete.txt memo-uniqueFile.txt
精彩评论