It’s really something to be learning Linux. The more I learn about Linux the more I learn it’s about manipulating letters and numbers. Well, this is more programming than anything but Linux is alot about that. Bash I’m discovering is great. I’m just getting into it and now have made things a good deal easier by learning how to copy and paste text to/from the xorg server clipboard from the terminal. Here’s a couple commands that can do it and a couple bash scripts that make it easier.
Xsel and xclip are command line programs that can redirect the contents of the xorg server clipboard. The xorg server has two clipboards: the common right-click ‘Copy’ or ‘Edit > Copy’ command, and one for the middle mouse click. For those that don’t know of it yet, the middle-click clipboard allows quick copy and pasting without having to enter a menu or using Ctrl + v. Anytime you select text on the xorg server there is a serperate register that records this text, then clicking the mouse button three (usually clicking down the scroll wheel) will paste the text. The xorg server defines the the middle-click clipboard as ‘primary’ and the right-click clipboard as ‘secondary’.
xclip
Xclip I prefer to xsel because I have found that xsel can have problems pasting to java apps.
You can use xclip in a variety of ways. For example it can be piped to:
echo "hi" | xclip -selection clipboard
This will copy to the standard clipboard. For abbreviation, you can use ‘c’ instead of ‘clipboard’. You can specify ‘primary’ or ‘p’ here too to copy to the third mouse button, but isn’t necessary as this is the default for xclip.
echo "hello" | xclip
To direct a file to xclip you use the ‘-in’ or ‘-out’ options:
xclip -in -selection c <filename> xclip -out -selection c <filename>
Which will respectively put a file into the clipboard, and write to a file from the clipboard contents.
To make the process quicker, I’ve created a couple scripts to automate the tasks called ‘cp2clip’ and ‘clippaste’ and can be used like a standard command:
cp2clip <filename> clippaste <filename>
cp2clip
#!/bin/bash
# cp2clip - copy to the clipboard the contents of a file
# Program name from it's filename
prog=${0##*/}
# Text color variables
bldblu='\e[1;34m' # blue
bldred='\e[1;31m' # red
bldwht='\e[1;37m' # white
txtbld=$(tput bold) # bold
txtund=$(tput sgr 0 1) # underline
txtrst='\e[0m' # text reset
info=${bldwht}*${txtrst}
pass=${bldblu}*${txtrst}
warn=${bldred}!${txtrst}
filename=$@
# Display usage if full argument isn't given
if [[ -z $filename ]]; then
echo " $prog <filename> - copy a file to the clipboard"
exit
fi
# Check that file exists
if [[ ! -f $filename ]]; then
echo -e "$warn File ${txtund}$filename${txtrst} doesn't exist"
exit
fi
# Check user is not root (root doesn't have access to user xorg server)
if [[ $(whoami) == root ]]; then
echo -e "$warn Must be regular user to copy a file to the clipboard"
exit
fi
# Copy file to clipboard, give feedback
xclip -in -selection c < "$filename"
echo -e "$pass ${txtund}"${filename##*/}"${txtrst} copied to clipboard"
clippaste
#!/bin/bash
# clippaste - Paste contents of clipboard to file in terminal.
# Program name from it's filename
prog=${0##*/}
# Text color variables
bldblu='\e[1;34m' # blue
bldred='\e[1;31m' # red
bldwht='\e[1;37m' # white
txtbld=$(tput bold) # bold
txtund=$(tput sgr 0 1) # underline
txtrst='\e[0m' # text reset
info=${bldwht}*${txtrst}
pass=${bldblu}*${txtrst}
warn=${bldred}!${txtrst}
filename=$@
pasteinfo="clipboard contents"
# usage if argument isn't given
if [[ -z $filename ]]; then
echo "clippaste <filename> - paste contents of context-menu clipboard to file"
exit
fi
# check if file exists, prompt to append or override, else create new
if [[ -f $filename ]]; then
echo -en "$warn File ${txtund}$filename${txtrst} already exists - (${txtbld}e${txtrst})xit, (${txtbld}a${txtrst})ppend, (${txtbld}o${txtrst})verwrite: "
read edit
case "$edit" in
[aA] ) xclip -out -selection clipboard >> $filename
echo -e "$pass File ${txtund}$filename${txtrst} appended with clipboard contents"
;;
[oO] ) xclip -out -selection clipboard > $filename
echo -e "$pass File ${txtund}$filename${txtrst} overwrote with clipboard contents"
;;
* ) exit
esac; else
xclip -out -selection clipboard >> $filename
echo -e "$pass File ${txtund}"$filename"${txtrst} created with clipboard contents"
fi
xsel
To copy to the context-menu clipboard:
xsel --clipboard < /etc/fstab
To copy a text to the middle mouse button clipboard:
xsel < /etc/fstab
Xsel can be piped too:
echo "a-bit-of-text" | xsel -b cat /etc/make.conf | xsel -b
To output directly to the terminal:
xsel --clipboard
And to redirect and append to a file:
xsel --clipboard > Baada-Boom.txt xsel --clipboard >> ~/.Baada-Boom
cp2clip (xsel)
#!/bin/bash
# cp2clip - copy to the clipboard the contents of a file
# Program name from it's filename
prog=${0##*/}
# Text color variables
bldblu='\e[1;34m' # blue
bldred='\e[1;31m' # red
bldwht='\e[1;37m' # white
txtbld=$(tput bold) # bold
txtund=$(tput sgr 0 1) # underline
txtrst='\e[0m' # text reset
info=${bldwht}*${txtrst}
pass=${bldblu}*${txtrst}
warn=${bldred}!${txtrst}
filename=$@
# Display usage if full argument isn't given
if [[ -z $filename ]]; then
echo " $prog <filename> - copy a file to the clipboard"
exit
fi
# Check that file exists
if [[ ! -f $filename ]]; then
echo -e "$warn File ${txtund}$filename${txtrst} doesn't exist"
exit
fi
# Check user is not root (root doesn't have access to user xorg server)
if [[ $(whoami) == root ]]; then
echo -e "$warn Must be regular user to copy a file to the clipboard"
exit
fi
# Copy file to clipboard, give feedback
xsel --clipboard < "$filename"
echo -e "$pass ${txtund}"${filename##*/}"${txtrst} copied to clipboard"
clippaste (xsel)
#!/bin/bash
# clippaste - Paste contents of clipboard to file in terminal.
# use 'xclip -out -selection primary' for middle click clipboard
# Program name from it's filename
prog=${0##*/}
# Text color variables
bldblu='\e[1;34m' # blue
bldred='\e[1;31m' # red
bldwht='\e[1;37m' # white
txtbld=$(tput bold) # bold
txtund=$(tput sgr 0 1) # underline
txtrst='\e[0m' # text reset
info=${bldwht}*${txtrst}
pass=${bldblu}*${txtrst}
warn=${bldred}!${txtrst}
filename=$@
pasteinfo="clipboard contents"
# usage if argument isn't given
if [[ -z $filename ]]; then
echo "clippaste <filename> - paste contents of context-menu clipboard to file"
exit
fi
# check if file exists, prompt to append or override, else create new
if [[ -f $filename ]]; then
echo -en "$warn File ${txtund}$filename${txtrst} already exists - (${txtbld}e${txtrst})xit, (${txtbld}a${txtrst})ppend, (${txtbld}o${txtrst})verwrite: "
read edit
case "$edit" in
[aA] ) xsel --clipboard >> $filename
echo -e "$pass File ${txtund}$filename${txtrst} appended with clipboard contents"
;;
[oO] ) xsel --clipboard > $filename
echo -e "$pass File ${txtund}$filename${txtrst} overwrote with clipboard contents"
;;
* ) exit
esac; else
xsel --clipboard >> $filename
echo -e "$pass File ${txtund}"$filename"${txtrst} created with clipboard contents"
fi

Great to find out about xsel! Unfortunately two of you examples are wrong:
echo “a-bit-of-text” | xsel -c
cat /etc/make.conf | xsel -c
do not copy “a-bit-of-text” or /etc/make.conf to the clipboard. They should be written:
echo “a-bit-of-text” | xsel –clipboard
cat /etc/make.conf | xsel –clipboard
or, as I prefer, with the -b flag (equivalent to –clipboard, 8 characters shorter)
echo “a-bit-of-text” | xsel -b
cat /etc/make.conf | xsel -b
The xsel -c flag does exist and is useful. It clears the clipboard. Forexample:
xsel -c -b
Or, if you want to clear the X Server clipboard (middle click clipboard), simply type
xsel -c
Enjoy!
Huh, hmm that did work the last time I used it. Wonder if xsel option have changed since, looks like it does. Thanks for the tip Colin. I use xclip now so it’s a good time to update post.
Awesome, thanks for the info
I really need this to copy between the primary and the clipboard for apps which don’t know about the primary eg netbeans.
Very nice Gen2ly, thanks for the idea!
_______________________
#!/bin/bash
# Paste the contents of the clipboard to a file.
FILENAME=$@
if [[ ! -z $FILENAME ]]; then
echo “clipb-pasted into $FILENAME “;
xsel -b > $FILENAME;
chmod 755 $FILENAME;
else
echo “no filenam declareted.”
exit;
fi
Neat. Thanx.
Thank you.
This is awesome, thakns so much!
[...] http://linuxtidbits.wordpress.com/2008/02/22/command-line-to-clipboard/ [...]
[...] phrase: bash copy to clipboard. Then start reading. Here is my favorite return on that search: http://linuxtidbits.wordpress.com/20…-to-clipboard/. But there others as [...]
!#/really/good/blog
if
i had to say one thing it’s
thank you
else
i would not speak truly
fi
[...] http://linuxtidbits.wordpress.com/2008/02/22/command-line-to-clipboard/ [...]
If you use xclip in conjunction with truecrypt you should be careful and use
truecrypt .pass /media/pass
cat /media/pass/password | xclip
truecrypt -d .sec
instead of
xclip -in /media/pass/password
because otherwise xclip will lock the file and you will get the following error message, when truecrypt tries to unmount the volume:
umount: /media/pass: device is busy.
[...] http://linuxtidbits.wordpress.com/2008/02/22/command-line-to-clipboard/ GA_googleAddAttr("AdOpt", "1"); GA_googleAddAttr("Origin", "other"); GA_googleAddAttr("LangId", [...]
[...] http://linuxtidbits.wordpress.com/2008/02/22/command-line-to-clipboard/ Advertisement GA_googleAddAttr("AdOpt", "1"); GA_googleAddAttr("Origin", "other"); [...]
A more thoroughly thought out cp2clip:
http://madebynathan.com/2011/10/04/a-nicer-way-to-use-xclip/
[...] from the command line. I new it was possible and was pleasantly surprised to find a simple tutorial posted by Gen2ly on Linux Tidbits. Following his suggestion I used xclip to handle my clipboard. [...]