Alright, this is a screwy answer, but it is also a screwy question, so at least they match. You can create a named pipe with mkfifo
, and then setup an infinite loop that reads files from the named pipe and pipes them to pbcopy
(or xsel
, xclip
, etc.).
1. In a terminal which is NOT in a screen session (run this only once):
/usr/bin/mkfifo /tmp/pbcopy.pipe
while true; do /bin/cat /tmp/pbcopy.pipe | /usr/bin/pbcopy; done
You may want to turn this into a shell script like (this probably should be more robust)
#!/bin/bash
if [[ -e /tmp/pbcopy.pipe ]]; then
echo "it looks like I am already running"
echo "remove /tmp/pbcopy.pipe if you are certain I am not"
exit 1
fi
while true; do
/bin/cat /tmp/pbcopy.pipe | /usr/bin/pbcopy
done
which you can name pbcopy_server.sh
, make executable (chmod a+x pbcopy_server.sh
) and put somewhere in your path, so you can say nohup pbcopy_server.sh &
when you first start your machine.
2. In any other terminal (including those in screen sessions) you can now cat files (or redirect output of programs into /tmp/pbcopy.pipe and the text will appear in the clipboard.
cat file > /tmp/pbcopy.pipe
df -h > /tmp/pbcopy.pipe
3. To make it look like you are calling the real pbcopy
you can use something to do the cat'ing to /tmp/pbcopy.pipe
for you.
3a. Use a zsh
function:
function pbcopy() { cat > /tmp/pbcopy.pipe }
3b. Or create a Perl script named pbcopy
and put it in a directory earlier in your PATH
than /usr/bin
:
#!/usr/bin/perl
use strict;
use warnings;
open my $out, ">", "/tmp/pbcopy.pipe"
or die "could not open pipe to pbcopy: $!\n";
print $out $_ while <>;