クリップボードを自作する

クリップボードに関してはコマンドライン上でのクリップボードの利用方法をご覧ください。


話を始める前に注意ですが、今回の内容はあくまで練習用であって、成果物を実際に使用することはおすすめしません。


上記内容を踏まえた上で話を進めます。


今回作成したいコマンドは tty-copytty-paste になります。

tty-copyは文字列をクリップボードに保存の処理になり、

$ tty-copy hoge

のように文字列をクリップボードに保存します。


tty-pasteはクリップボードの保存された値を貼り付ける処理になり、

$ tty-paste > paste.txt
$ cat paste.txt
hoge

と出力されることを目標にします。




クリップボードを自作する上で注意すべき事として、

・クリップボードに保存した文字列を他のユーザが読み込むことが出来ないようにする

・再起動した時にクリップボードには何も残っていないようにする。

があります。


この2つの項目を解消するコマンドとして、mktemp があります。

mktemp は一意な名前の一時ファイルを簡単に作成するためのコマンドです。

一時ファイルとは、プログラムの実行中に一時的にデータを保存するためのファイルで、通常、プログラムが終了すると削除されます。




mkempを試してみます。

$ mktemp
/tmp/tmp.1hWlR3JNwC

上記のパスで一時ファイルが生成されました。


一時ファイルの権限を調べてみますと、

$ ls -l /tmp/tmp.1hWlR3JNwC 
-rw------- 1 pi pi 0 Dec  2 12:00 /tmp/tmp.1hWlR3JNwC

作成したアカウントにのみ、読み込み(r)と書き込み(w)の権限が付与されていました。

【初級】システム管理2 chmod


今回作成されたファイルですが、システムディレクトリの /tmp 以下に生成されていました。

/tmp ディレクトリは、Linux システムにおいて、一時的なファイルを保存するための領域になります。

プログラムの実行中に一時的に生成されるファイルや、ユーザーが一時的に保存したいデータを置くために使用されます。


/tmp ディレクトリにファイルを作成する最大の利点は、システム再起動時に削除されるということがあります。


先程挙げましたクリップボードの2つの要件を、mktemp のみで解消することができることがわかりました。




.bashrcの末尾に下記のコードを追加します。

$ cd ~
$ micro .bashrc
export CLIPBOARD
if [ -z CLIPBOARD ]; then
	CLIPBOARD=$(mktemp)
	readonly CLIPBOARD
fi

tty-copy(){
	echo -n $1 > $CLIPBOARD
	
	# 下記コマンドはデバック用
	echo "copied "$CLIPBOARD
}

tty-paste(){
	# 下記コマンドはデバック用
	echo "from "$CLIPBOARD
	cat $CLIPBOARD
	echo
}

.bashrcを保存後、

$ source .bashrc

でBashの再起動を行った後に

$ tty-copy hoge
$ tty-paste > paste.txt
$ cat paste.txt

を試してみます。


paste.txt内に

hoge

の文字列の確認ができれば良いです。




export CLIPBOARD
if [ -z CLIPBOARD ]; then
	CLIPBOARD=$(mktemp)
	readonly CLIPBOARD
fi

上記のコードですが、

export CLIPBOARD

でシェル変数のCLIPBOARDをグローバル変数化します。


if [ -z CLIPBOARD ]; then
	CLIPBOARD=$(mktemp)
	readonly CLIPBOARD
fi

は一時ファイルのパスをCLIPBOARDに代入した後にreadonlyで以後の処理でCLIPBOARD変数を変更不可にします。

※ if文で囲うのは、何度も

$ source .bashrc

を実行できるようにするためです。


tty-copy と tty-paste の処理の詳細は省略します。

同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。