Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBashを始めとするLinuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。
最新版は「ip」コマンドのバグに注意
長年Linuxディストリビューションは、「net-tools」パッケージでネットワーク関連機能を実現してきた。同パッケージは、ネットワークインターフェースの確認や設定を行う「ifconfig」コマンドや、相手サーバーの存在を確認する「ping」コマンドなどを含んでいる。
だが、同パッケージは無線LANをコントロールする「iwconfig」コマンド以外は久しくメンテナンスされておらず、現在は推奨されていない。既にBUW(Bash on Ubuntu on Windows)はUbuntu 16.04 LTSをベースにしており、リリース当初は未対応だったネットワーク機能も少しずつサポートしている。
しかし、執筆時点の最新版であるWindows 10 Insider Preview ビルド14986は、32バイトのハードウェアアドレスを取得すると、WSLがクラッシュするバグが潜んでいると、Microsoftは注意をうながしている。筆者はまだBUWからネットワークを操作する機会が少ないため、BUWがクラッシュするような場面に遭遇していないが、Linux上で書いたシェルスクリプトを持ち込んでいる方は注意してほしい。
「colordiff」を利用する
さて、前回はWindowsの「Reg.exe」コマンドと、Linux側の「diff」コマンドを使ってレジストリエントリーの比較を行ったが、diffのunified形式に不慣れな方に違いは分かりにくいのではないだろうか。そこで導入しておきたいのが「colordiff」である。
Perlのスクリプトであるcolordiffは出力結果を配色するdiffのラッパーだが、その内容はこちらのページにあるスクリーンショットをご覧になれば一目瞭然。これを前回作成したシェルスクリプトに適用すれば、視認性も高まるはずだ。「sudo apt-get install colordiff -y」と実行すれば、お使いのBUW環境にパッケージをインストールできるので、事前に実行してほしい。
まずは12行目にある「diff」を「colordiff」を置き換えてシェルスクリプトを実行してみよう。そのまま出力する場合は特に大きな問題もなく、ファイルごとに配色が加わり、異なる部分が色付きで示される。
では、前回述べたように標準出力ではなく「less」コマンドを使って比較結果をビューアーで表示させてみよう。だが、そのままではうまく行かない。colordiffはエスケープシーケンスを用いて配色しているため、そのままでは表示できないからだ。
この問題を回避するには、lessコマンドのオプション「--RAW-CONTROL-CHARS(-R)」で各制御文字に対応させる。さらにreg.exeコマンドが出力するファイルの改行コードがCR+LFのため、「^M」と表示されてしまうのは面白くない。そこでlessコマンドのオプション「--raw-control-chars(-r)」を追加する。このような処理を加えたのが下記のシェルスクリプトだ。いつもと同じくご自身の環境に合わせて修正し、実行権限を与えてからお試し頂きたい。
#!/bin/bash
TargetKey=HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer
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 | less -Rr
rm $BeforeFile $AfterFile
今回の変更点は12行目のみ。diffをcolordiffに置き換え、パイプを使って「less -Rr」に比較結果を渡している。下図の例では変更前は赤色、変更後は青色の状態で示されるようになった。筆者が意図的に作成したDWORD値「Test」の値が異なっていることがひと目で分かる。
阿久津良和(Cactus)