Windows 10のクリップボードをWSL bashに同期する

    >


WindowsのクリップボードをWSL bashに同期するスクリプトを書きました。

WindowsとWSL間でクリップボードが共有できたらいいなぁとはいつも思うことですが、方法はいくらかあります。

まず、xmingなどのxサーバーシステム経由でクリップボードを共有する方法。こちらは、僕の場合はだめでした。謎のエラーが出ます。むしろxmingはクリップボード共有機能をディスエイブルしないと使い物になりません。

次に、サードパーティ製ソフトウェアを使う方法。僕が使ったことがあるのは、chrome拡張機能のClipbrd Beta – Chrome Web Store

こちらであれば、chromeをインストールしていれば、android、linux、windows,macでクリップボードの相互同期が可能です。便利。

たーだし。
デベロッパーが良い方だと悪いですが、僕はこういうの信用していないので、基本的にオフにしています。つっても使わない度に拡張機能をアンインストールしてたらきり無いので、Extensions Manager (aka Switcher) – Chrome Web Storeといった拡張機能管理エクステンションを使うことをおすすめ。
というのも、仲介サーバーでどういう処理をしているかブラックボックスなので、怖いですから。はっきりいって、コピーしたテキストデータ(e.g.パスワード)全部筒抜けてることも考えたほうがいいわけです。こちらの拡張機能自体ちょっと臭う部分があるので、まぁ。使うかどうかは任せます。

で、もう一つが、自分で書いてしまう方法ですね。といってもこちらのスクリプトでは相互同期は難しかったので、windowsからwslへの一方通行同期です。windowsのクリップボードが更新されたらwslへコピーします。


ミツモア

必要準備

dittoをインストール

この関数ではdittoというクリップボードマネージャーから生成されたsqliteデータベースファイルを使用しています。なのでインスコしてください。

Ditto download | SourceForge.net

スクリプト


syncWindowsClipboardToWSL(){ while [ true ]; do WSLClipboardText="$(xclip -o -selection clipboard)" WindowsClipboardText="$(sqlite3 /mnt/c/Users/${WINUSER}/AppData/Roaming/Ditto/Ditto.db "$(cat <<'EOT' SELECT mText from Main order by clipOrder desc LIMIT 1 OFFSET 0 EOT )")" [[ "${WSLClipboardText}" != "${WindowsClipboardText}" ]] && { echo "${WindowsClipboardText}" | xclip -sel clip ; printf "Copied Windows clipboard to WSL." ; } || echo -ne "$(isodate)\tNothing updated on the clipboard.\033[0K\r" sleep 2s done } alias synccltowsl="syncWindowsClipboardToWSL"

書き換えればwsl to windowsもできるはずです。ただし相互同期となるとちょっと時間が必要そう。

相互同期してくれるコードとかソフトウェアがあったらコメントで教えてくださると嬉しいです。

追記

バグ直しました。

データベースを直接弄るとdittoがたまにクラッシュするので、一度コピーしてからコピーしたものを弄るようにします。

syncWindowsClipboardToWSL(){

while [ true ];
do

cp /mnt/c/Users/ifgm2/AppData/Roaming/Ditto/Ditto.db $TMPDIR/Ditto.db

WSLClipboardText="$(xclip -o -selection clipboard)"

# WindowsClipboardText="$(sqlite3 /mnt/c/Users/${WINUSER}/AppData/Roaming/Ditto/Ditto.db "$(cat <<'EOT'
# SELECT mText from Main
# order by clipOrder desc
# LIMIT 1 OFFSET 0
# EOT
# )")"
WindowsClipboardText="$(sqlite3 $TMPDIR/Ditto.db "$(cat <<'EOT'
SELECT mText from Main
order by clipOrder desc
LIMIT 1 OFFSET 0
EOT
)")"

[[ "${WSLClipboardText}" != "${WindowsClipboardText}" ]] && { echo "${WindowsClipboardText}" | xclip -sel clip ; printf "Copied Windows clipboard to WSL." ; } || echo -ne "$(isodate)\tNothing updated on the clipboard.\033[0K\r"
# [[ "${WSLClipboardText}" != "${WindowsClipboardText}" ]] && { printf "$(isodate|chomp)\t${WSLClipboardText}\n" >> ~/WSLClipboardText.log ; printf "$(isodate|chomp)\t${WindowsClipboardText}\n" >> ~/WindowsClipboardText.log ; \
#    } || echo same.
#
# hgoe fuga
# hoge foo

sleep 2s

done

: <<'NOTE'

Error: database disk image is malformed on the clipboard.

NOTE

}

alias synccltowsl="syncWindowsClipboardToWSL"
isodate はじめてのBash。関数やエイリアスを読み込むまで [初心者向け]

  isodate(){
    date +%FT%T%Z
  }

WSL WSL bash on ubuntu on windows インストール手順
WSL(Windows Subsystem for Linux)を初期から使っている僕がLinuxやプログラミングの初心者向けにWSLのメリットを解説してみる



お困りですか?この記事で紹介していることをマンツーマンで指導、解説、代行します。まずはお気軽にお問い合わせください。


Close Menu