Is it possible to pipe to/from the clipboard in Bash?
Whether it is piping to/from a device handle or using an auxiliary application, I can't find anything.
For example, if /dev/clip
was a device linking to the clipboard we could do:
cat /dev/clip # Dump the contents of the clipboard
cat foo > /dev/clip # Dump the contents of "foo" into the clipboard
:%y+
in vim, which is vim-speak for "yank (copy) all the lines into the '+' register (the X PRIMARY
clipboard)". You can replace %
with a range if you want to be specific. But there's three caveats: 1. Now, you have to save whatever text to a file before you can copy it. This is in contrast to the xclip
command mentioned in the answers. 2. If you don't already know how to vim, this might be tedious. 3. You can only do this if a certain feature is enabled when compiling vim. If you install GVim, it should be enabled by default in both GUI and terminal instances of vim.
xclip
. Your answered worked like a charm.
:%y+
one but ok, you've got all bases covered! Good one.
There are a wealth of clipboards you could be dealing with. I expect you're probably a Linux user who wants to put stuff in the X Windows primary clipboard. Usually, the clipboard you want to talk to has a utility that lets you talk to it.
In the case of X, there's xclip
(and others). xclip -selection c
will send data to the clipboard that works with Ctrl + C, Ctrl + V in most applications.
If you're on Mac OS X, there's pbcopy
. E.g., cat example.txt | pbcopy
If you're in Linux terminal mode (no X) then look into gpm
or Screen which has a clipboard. Try the Screen command readreg
.
Under Windows 10+ or Cygwin, use /dev/clipboard
or clip
.
Make sure you are using alias xclip="xclip -selection c"
or else you won't be able to paste using Ctrl+v.
Example: After running echo -n test | xclip
, Ctrl+v will paste test
xclip -selection clipboard -o
alias pbcopy="xclip -selection c"
alias pbpaste="xclip -selection clipboard -o"
Hope that helps.
xclip
isnt adding a newline, echo
is. Try printf test | xclip -i -selection clipboard
. (printf
doesnt add a newline unless you write 'test\n'
.)
echo -n
instead of printf
.
Install
# You can install xclip using `apt-get`
apt-get install xclip
# or `pacman`
pacman -S xclip
# or `dnf`
dnf install xclip
If you do not have access to apt-get
nor pacman
, nor dnf
, the sources are available on sourceforge.
Set-up
Bash
In ~/.bash_aliases
, add:
alias setclip="xclip -selection c"
alias getclip="xclip -selection c -o"
Do not forget to load your new configuration using . ~/.bash_aliases
or by restarting your profile.
Fish
In ~/.config/fish/config.fish
, add:
abbr setclip "xclip -selection c"
abbr getclip "xclip -selection c -o"
Do not forget to restart your fish instance by restarting your terminal for changes to apply.
Usage
You can now use setclip
and getclip
, e.g:
$ echo foo | setclip
$ getclip
foo
sudo pacman -S xclip
. But do note that .bashrc
is not the best place. I recommend the enduser read up on proper bashrc, bash_aliases and .profile files and how bash handles each. Tip: put it in .bash_aliases instead.
pacman
package manager and removed the .bashrc
proposition. I know .bash_aliases
is more adapted, but the end result is the same (.bashrc
simply requires .bash_aliases
if it exists). If people want a messy system, let them have one. :)
.bash_aliases
in the bash manual. I believe that must be a distro-specific modification to .bashrc
. (I have seen distro-specific .bashrc
s which import .bash_profile
if it exists.) Based on that, I'd say .bash_aliases
is not a universal convention, but a convenient shorthand for those who have it.
.bashrc
sources .bash_aliases
at the end. ;) I follow this old convention, that remains 100% compatible across Arch, Ubuntu/Debian, Raspberry variants, macOS/OSX and Windows Bash: stefaanlippens.net/my_bashrc_aliases_profile_and_other_stuff With that convention, I use the exact same dotfiles across all of the machines I touch. It's quite nice: github.com/eduncan911/dotfiles
On macOS, use the built-in pbcopy
and pbpaste
commands.
For example, if you run
cat ~/.bashrc | pbcopy
the contents of the ~/.bashrc
file will be available for pasting with the Cmd + V shortcut.
To save the current clipboard to a file, redirect the output pbpaste
to a file:
pbpaste > my_clipboard.txt
pbcopy < my_clipboard.txt
can also be used for copying contents from a file.
2018 answer
Use clipboard-cli. It works with macOS, Windows, Linux, OpenBSD, FreeBSD, and Android without any real issues.
Install it with:
npm install -g clipboard-cli
Then you can do:
echo foo | clipboard
If you want, you can alias to cb
by putting the following in your .bashrc
, .bash_profile
, or .zshrc
:
alias cb=clipboard
npm
package?
xsel on Debian/Ubuntu/Mint
# append to clipboard:
cat 'the file with content' | xsel -ab
# or type in the happy face :) and ...
echo 'the happy face :) and content' | xsel -ib
# show clipboard
xsel -ob
# Get more info:
man xsel
Install
sudo apt-get install xsel
echo "foo" | xclip -selection c
?
xsel
and xclip
are equivalent in every way except that xclip
can read/write files by name, but xsel
requires shell redirection if you want to access a file.
xsel
is working nicely from scripts, while xclip
is working only from the prompt. Not sure why.
On the Windows Subsystem for Linux (WSL) you can copy to the clipboard with clip.exe:
cat file | clip.exe
Keep in mind to use the |
pipe command. And not a >
command, since that will not work.
Install the xcopy utility and when you're in the Terminal, input:
Copy
Thing_you_want_to_copy | xclip -selection c
Paste
myvariable=$(xclip -selection clipboard -o)
I noticed a lot of answers recommended pbpaste and pbcopy. If you're into those utilities, but for some reason they are not available in your repository, you can always make an alias for the xcopy commands and call them pbpaste and pbcopy.
alias pbcopy="xclip -selection c"
alias pbpaste="xclip -selection clipboard -o"
So then it would look like this:
Thing_you_want_to_copy | pbcopy
myvariable=$(pbpaste)
An answer located in one of the comments written by a user called doug work for me. Since I found it so helpful, I decided to restate in an answer.
Here is a ready-to-use Bash script for reading the clipboard which works on multiple platforms.
Please edit the script here if you add functionality (e.g., more platforms).
#!/bin/bash
# WF 2013-10-04
#
# Multi-platform clipboard read access
#
# Supports
# Mac OS X
# Git shell / Cygwin (Windows)
# Linux (e.g., Ubuntu)
#
# Display an error
#
error() {
echo "error: $1" 1>&2
exit 1
}
#
# getClipboard
#
function getClipboard() {
os=`uname`
case $os in
# Git Bash (Windows)
MINGW32_NT-6.1)
cat /dev/clipboard;;
# Mac OS X
Darwin*)
pbpaste;;
# Linux
Linux*)
# Works only for the X clipboard - a check that X is running might be due
xclip -o;;
*)
error "unsupported os $os";;
esac
}
tmp=/tmp/clipboard$$
getClipboard >$tmp
cat $tmp
# Comment out for debugging
rm $tmp
For Mac only:
echo "Hello World" | pbcopy
pbpaste
These are located /usr/bin/pbcopy
and /usr/bin/pbpaste
.
On Windows (with Cygwin) try cat /dev/clipboard
or echo "foo" > /dev/clipboard
as mentioned in this article.
clip
. I'm using msysgit 1.9.5 and this worked.
echo "foo" > /dev/clipboard
seems to destroy newlines completely (not a \r\n \n thing but completely gone)
There are different clipboards in Linux; the X server has one, the window manager might have another one, etc. There is no standard device.
Oh, yes, on CLI, the screen program has its own clipboard as well, as do some other applications like Emacs and vi.
In X, you can use xclip.
You can check this thread for other possible answers: http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2004-07/0919.html
This is a simple Python script that does just what you need:
#!/usr/bin/python
import sys
# Clipboard storage
clipboard_file = '/tmp/clipboard.tmp'
if(sys.stdin.isatty()): # Should write clipboard contents out to stdout
with open(clipboard_file, 'r') as c:
sys.stdout.write(c.read())
elif(sys.stdout.isatty()): # Should save stdin to clipboard
with open(clipboard_file, 'w') as c:
c.write(sys.stdin.read())
Save this as an executable somewhere in your path (I saved it to /usr/local/bin/clip
. You can pipe in stuff to be saved to your clipboard...
echo "Hello World" | clip
And you can pipe what's in your clipboard to some other program...
clip | cowsay
_____________
< Hello World >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Running it by itself will simply output what's in the clipboard.
cat tmpfile
, not clipboard operation. //same as @horta answers.
I have found a good reference: How to target multiple selections with xclip
In my case, I would like to paste content on the clipboard and also to see what is been pasted there, so I used also the tee
command with a file descriptor:
echo "just a test" | tee >(xclip -i -selection clipboard)
>()
is a form of process substitution. Bash replaces each with the path to a file descriptor which is connected to the standard input of the program within the parentheses.
The tee
command forks your command allowing you to "pipe its content" and see the result on standard output "stdout".
You can also create aliases to get and write on the clipboard, allowing you to use "pbcopy" and "pbpaste" as if you where on Mac. In my case, as I use Z shell (zsh
), I have this in my aliases file:
(( $+commands[xclip] )) && {
alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
}
The (( $+command[name] ))
in Z shell tests if the command "name" is installed on your system, and then both aliases are grouped with {}
. The &&
is a binary AND; if a then b, hence if you have xclip then the aliases will be set.
echo "another test" | tee >(pbcopy)
To get your clipboard content, just type:
pbpaste | "any-command-you-need-here"
xsel -b
Does the job for X Window, and it is mostly already installed. A look in the man page of xsel is worth the effort.
Copy and paste to clipboard in Windows (Cygwin):
See:
$ clip.exe -?
CLIP
Description:
Redirects output of command line tools to the Windows clipboard.
This text output can then be pasted into other programs.
Parameter List:
/? Displays this help message.
Examples:
DIR | CLIP Places a copy of the current directory
listing into the Windows clipboard.
CLIP < README.TXT Places a copy of the text from readme.txt
on to the Windows clipboard.
Also getclip (it can be used instead of Shift + Ins!) and putclip (echo oaeuoa | putclip.exe to put it into clip) exist.
pbcopy is built into OS X:
Copying the content of file .bash_profile:
cat ~/.bash_profile | pbcopy
I just searched the same stuff in my KDE environment.
Feel free to use clipcopy
and clippaste
.
KDE:
> echo "TEST CLIP FROM TERMINAL" | clipcopy
> clippaste
TEST CLIP FROM TERMINAL
In Linux this works:
cat filename | xclip
There are a couple of ways. Some of the ways that have been mentioned include (I think) tmux, Screen, Vim, Emacs, and the shell. I don't know Emacs or Screen, so I'll go over the other three.
Tmux
While not an X selection, tmux has a copy mode accessible via prefix-[
(prefix
is Ctrl + B by default). The buffer used for this mode is separate and exclusive to tmux, which opens up quite a few possibilities and makes it more versatile than the X selections in the right situations.
To exit this mode, hit Q; to navigate, use your Vim or Emacs binding (default = Vim), so hjkl
for movement, v/V/C-v
for character/line/block selection, etc. When you have your selection, hit Enter to copy and exit the mode.
To paste from this buffer, use prefix-]
.
Shell
Any installation of X11
seems to come with two programs by default: xclip
and xsel
(kind of like how it also comes with both startx
and xinit
). Most of the other answers mention xclip
, and I really like xsel
for its brevity, so I'm going to cover xsel
.
From xsel(1x):
Input options \ -a, --append \ append standard input to the selection. Implies -i. -f, --follow \ append to selection as standard input grows. Implies -i. -i, --input \ read standard input into the selection. Output options \ -o, --output \ write the selection to standard output. Action options \ -c, --clear \ clear the selection. Overrides all input options. -d, --delete \ Request that the current selection be deleted. This not only clears the selection, but also requests to the program in which the selection resides that the selected contents be deleted. Overrides all input options. Selection options \ -p, --primary \ operate on the PRIMARY selection (default). -s, --secondary \ operate on the SECONDARY selection. -b, --clipboard \ operate on the CLIPBOARD selection.
And that's about all you need to know. p
(or nothing) for PRIMARY
, s
for SECONDARY
, b
for CLIPBOARD
, o
for output.
Example: say I want to copy the output of foo
from a TTY and paste it to a webpage for a bug report. To do this, it would be ideal to copy to/from the TTY/X session. So the question becomes how do I access the clipboard from the TTY?
For this example, we'll assume the X session is on display :1
.
$ foo -v
Error: not a real TTY
details:
blah blah @ 0x0000000040abeaf4
blah blah @ 0x0000000040abeaf8
blah blah @ 0x0000000040abeafc
blah blah @ 0x0000000040abeb00
...
$ foo -v | DISPLAY=:1 xsel -b # copies it into clipboard of display :1
Then I can Ctrl + V it into the form as per usual.
Now say that someone on the support site gives me a command to run to fix the problem. It's complicated and long.
$ DISPLAY=:1 xsel -bo
sudo foo --update --clear-cache --source-list="http://foo-software.com/repository/foo/debian/ubuntu/xenial/164914519191464/sources.txt"
$ $(DISPLAY=:1 xsel -bo)
Password for braden:
UPDATING %%%%%%%%%%%%%%%%%%%%%%% 100.00%
Clearing cache...
Fetching sources...
Reticulating splines...
Watering trees...
Climbing mountains...
Looking advanced...
Done.
$ foo
Thank you for your order. A pizza should arrive at your house in the next 20 minutes. Your total is $6.99
Pizza ordering seems like a productive use of the command line.
...moving on.
Vim
If compiled with +clipboard
(This is important! Check your vim --version
), Vim should have access to the X PRIMARY
and CLIPBOARD
selections. The two selections are accessible from the *
and +
registers, respectively, and may be written to and read from at your leisure the same as any other register.
For example:
:%y+ ; copy/yank (y) everything (%) into the CLIPBOARD selection (+)
"+p ; select (") the CLIPBOARD selection (+) and paste/put it
ggVG"+y ; Alternative version of the first example
If your copy of Vim doesn't directly support access to X selections, though, it's not the end of the world. You can just use the xsel
technique as described in the last section.
:r ! xsel -bo ; read (r) from the stdout of (!) `xsel -bo`
:w ! xsel -b ; write (w) to the stdin of (!) `xsel -b`
Bind a couple key combos and you should be good.
DISPLAY=
when calling an X application from a non-X environment. X apps need the DISPLAY
environment variable to figure out which server (or is there just one server handling multiple sessions?) they're talking to. Try DISPLAY=:1 firefox
(or whatever your display ID may be; mine just happens to be :1
) from a TTY, for example.
:%y+
in VIM.
The Ruby oneliner inspired me to try with Python.
Say we want a command that indents whatever is in the clipboard with four spaces. It is perfect for sharing snippets on Stack Overflow.
$ pbpaste | python -c "import sys
for line in sys.stdin:
print(f' {line}')" | pbcopy
That's not a typo. Python needs newlines to do a for loop. We want to alter the lines in one pass to avoid building up an extra array in memory.
If you don't mind building the extra array try:
$ pbpaste | python -c "import sys; print(''.join([f' {l}' for l in sys.stdin]))" | pbcopy
but honestly awk is better for this than python. I defined this alias in my ~/.bashrc
file
alias indent="pbpaste | awk '{print \" \"\$0}' | pbcopy"
Now when I run indent
, whatever is in my clipboard is indented.
''.join(f' {l}' for l in sys.stdin)
-- also for most folks python
will point to python2 on MacOS. So, you may want to specify python3
instead.
A few Windows programs I wrote years ago. They allow you dump, push, append and print the clipboard. It works like this:
dumpclip | perl -pe "s/monkey/chimp/g;" | pushclip
It includes source code: cmd_clip.zip
From this thread, there is an option which does not require installing any gclip
/xclip
/xsel
third-party software.
A Perl script (since Perl is usually always installed)
use Win32::Clipboard;
print Win32::Clipboard::GetText();
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
In macOS, use pbpaste
.
For example:
Update the clipboard
pbpaste | ruby -ne ' puts "\|" + $_.split( )[1..4].join("\|") ' | pbcopy
A way to paste from the clipboard to a file without any tools except echo
.
Escape single quotes in the text you want to paste: replace all occurrences of ' with '\'' and copy the result to clipboard. Type echo -n ' Press Shift + Insert Type ' > filename.txt Press Enter
Basically you're doing this:
echo -n 'copied "text" with '\''single quotes'\'' escaped' > filename.txt
It works even if the copied text has new lines.
For mac you can use this function which uses pbcopy
and pbpaste
, but a little easier:
Add this to your .bashrc
or .zshrc
:
clp() {
if [[ -z "$1" ]]
then
# No input - act as paste
pbpaste;
else
# Input exists - act as copy
echo "$1" | pbcopy;
fi
}
To copy use clp "Content"
and to paste use clp
If you're like me and run on a Linux server without root privileges and there isn't any xclip or GPM you could workaround this issue by just using a temporary file. For example:
$ echo "Hello, World!" > ~/clip
$ echo `cat ~/clip`
Hello, World!
X selections
(which is necessarily implied by "clipboard" and any mentions of xclip/xsel), you need an active X session (and thus an X server) so that you can access the selection in the first place. To see what I mean, try running DISPLAY="" xsel
on your local machine. It will exit on an error, being unable to find session ""
, and no interaction with any X selection will be made. That's why I initially said that I don't see how root privileges factor into this: root or no root, you're not likely to find an X selection useful in a server environment.
Success story sharing
/dev/clipboard
also works for Msys/MinGW bash shellsxclip -selection c
will send data to the clipboard that works with ^C, ^V in most applicationsclip
like this:dir | clip
/dev/clipboard
, and forces to install either xclip either gpm which is missing by default at least in Kubuntu (I guess in most other distros too).