Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBashを始めとするLinuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。
コマンドラインからキーを指定可能にする
過去2回(第24回/第25回)にわたってWindows 10のReg.exeコマンドの出力結果を、BUW(Bash on Ubuntu on Windows)のdiffコマンドで比較するシェルスクリプトを書いていたが、日常的に使うには少々使いにくい。それは対象となるレジストリキーを固定しているからだ。そこで、今回はシェルスクリプトを普段から使えるようにするため、コマンドラインオプションを強化し、任意のレジストリキーを比較可能にする。
さらに既存のシェルスクリプトでは、colordiffの出力結果をビューアーのlessに直接渡していたが、今回はファイルとして出力し、後から参照できるように変更しよう。そのために用いるのは過去の連載でも利用しているBashの内部関数「getopts」だ。今回はターゲットとなるレジストリキーと、出力先となるファイル名が必要となるため、「:(コロン)」を付けて引数を変数に代入する。また、レジストリキーおよびファイル名の指定がない場合はエラーになってしまうため、シェルスクリプト側でエラーチェックルーチンを追加することにした。
このような前提で作成したのが下記のシェルスクリプトである。いつもどおり、vimなどのテキストエディターにコピー&ペーストし、chmodコマンドで実行権限を付与してから、お試し頂きたい。
#!/bin/bash
CMDNAME=`basename $0`
function usage() {
echo "Usage: $CMDNAME -k Key -f OutputFile" 1>&2
exit 0
}
while getopts :k:f: Option
do
case $Option in
k )
if [ -z "$OPTARG" ]; then
echo usage;
fi
Flag_K="TRUE"
TargetKey=$OPTARG ;;
f )
if [ -z "$OPTARG" ]; then
echo usage;
fi
Flag_F="TRUE"
FileName=$OPTARG ;;
\?* )
usage ;;
esac
done
if [ $# -ne 4 ]; then
echo "オプションが不正です." 1>&2
exit 1
fi
shift $((OPTIND - 1))
if [ "$Flag_K" = "TRUE" -a "$Flag_F" = "TRUE" ]; then
Option='/s /reg:64'
BeforeFile=/mnt/c/Users/kaz/Desktop/$$tmp1.txt
AfterFile=/mnt/c/Users/kaz/Desktop/$$tmp2.txt
reg.exe query $TargetKey $Option > $BeforeFile
read -p "操作を終えたら[Enter]キーを押してください."
reg.exe query $TargetKey $Option > $AfterFile
colordiff -a -u $BeforeFile $AfterFile > $FileName
rm $BeforeFile $AfterFile
fi
まずは実行結果からご覧頂こう。オプション「ー?」を付けた場合はシェルスクリプトの使い方を示し、引数が足りない場合はエラーになる。オプション「-k」の引数にレジストリキー、オプション「-f」の引数にファイル名を指定すると、前回と同様に1度現在のレジストリファイルを出力してから一時停止。この間に操作を行い、[Enter]キーを押すと再びレジストリファイルの出力を実行して、その比較結果を指定したファイルに出力する。
冒頭で述べたように5~28行目はオプション操作に関するコード。変数「OPTARG」に格納された引数を各変数に代入している。ポイントは30~33行目のif文。今回のシェルスクリプトは、2つのオプションと2つの引数が必要になるため、引数の合計値が「4」以外の場合はechoでメッセージを出力し、エラーコード1で終了する。
阿久津良和(Cactus)