@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

WSL内のdockerコンテナからWindowsのクリップボードにコピーする

tl;dr

  • WSL上で clip.exe を使うとWindows上のクリップボードにコピーできる
  • WSL上でパイプを作って、そこにコンテナから書き込むことでパイプ内のテキストを読み取れる

この2つを組み合わせてパイプに書き込まれたらクリップボードにコピーする流れを無限ループで動かす。

具体的なスクリプトなどはここにまとめた。README見ればだいたいできるはず。

github.com

参考にしたところ

www.raymondcamden.com

↑clip.exeが使えるで、という記事

stackoverflow.com

↑パイプを作ってループでそこを監視してdockerのボリュームに指定して利用できるで、という部分を利用した。このStackOverflowの回答では内容をevalして任意のコマンドを実行できるようにしている。

今回はコピーしたいだけなので、 eval "$(cat /path/to/pipe/mypipe)" 部分は cat /path/to/pipe/mypipe | clip.exe とコピーするだけにした。

その他

パイプ作る部分

[ -p /clip ] && echo already exists the pipe for copy || sudo mkfifo /clip

/clipにmkfifoでパイプを作ると、ここに書き込んだ内容は受け手が読み取るまであいてる。

パイプが存在するかどうかは [ -p /clip ] でtestできる。

cat /clipすると、書き込まれるまで待機して、書き込み終わると出力して終わってくれる。おもしろい

以下READMEの転記

Usage

after setup, you can use the copy in container by volumes.

$ sudo docker run -it -v /clip:/clip alpine sh
/ # date > /clip

you can set alias for copy

/ # alias C='cat - > /clip'
/ # date | C

setup

  • create pipe
  • put script for copy loop with clip.exe
  • setup crontab

create pipe

[ -p /clip ] && echo already exists the pipe for copy || sudo mkfifo /clip

put script

copy script in this repo into where you want and add exec permission.

script is like this.

#!/bin/bash
while true
do
  # clip.exe should in /mnt/c/windows/system32/clip.exe
  # you can check it by "which clip.exe"
  # this `cat' waits input and then exit after receiving content
  cat /clip | clip.exe
done

setup crontab

edit crontab by crontab -e and put below.

@reboot /path/to/copy.sh