Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBashを始めとするLinuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。
フォーラムに寄せられるWSL/BUWへの意見
MicrosoftはWSLやBUW(Bash on Ubuntu on Windows)の開発に利用者の声を積極的に受け入れている。現在GitHubでのプルリクエストや、開発者向けユーザーコミュニティサイトで意見を受け付けているが、後者はBUW専用ではなくコマンドプロンプトやコンソールも含んでいるものの、やはり1番人気はBUW/WSLだ。今回はここからいくつかの意見をご紹介したい。
とあるユーザーはフォーラムに、「Bashを閉じた後も処理を継続させてほしい」という意見を寄せていた。本件に対してMicrosoftシニアプログラムマネジャーのRich Turner氏は開発チームを代表して、「我々はこのシナリオを重要視している。BashシェルスクリプトやLinuxのツールがバックグラウンドで実行し続けることは難しく、将来的な目標としたい」と回答している。
また、別のユーザーは「NFSやsshfs、SAMBAをネットワークドライブとしてマウントしたい」という希望に対し、開発チームは「この依頼はバックログにあるが、現在スケジュールされていない」と少々つれない回答を行っている。投稿日時が2016年4月であり、ネットワーク周りはWSLの苦手分野であり、pingも飛ばせない状況だったことも関係しているのだろう。
着々と互換性を高めつつあるWSLだが、前述の意見にあるとおり、スケジュールに応じてコマンドを実行するcronは動作せず、Linuxディストリビューションと比べると見劣りする部分があるのも事実だ。WSL開発チームの尽力を期待したい。
Reg.exeの出力結果を比較する
さて、第22回で述べたようにBUW上からWin32アプリケーションの呼び出しが可能になったため、数回前からPowerShellを利用したシェルスクリプトを紹介してきた。筆者はWindowsのデータベースであるレジストリを調査する機会が多く、Windows Sysinternalsの「Process Monitor」を利用している。
それでも全体的な変化を確認するため、レジストリエントリーの内容を出力し、テキストエディターで比較することもあるが、いかんせんWin32アプリケーションで手に馴染む比較ツールを見つけることができない。そこで作成したのが、今回のシェルスクリプトである。いつもと同じく実行権限を与えてからお試し頂きたい。
#!/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
diff -a -u $BeforeFile $AfterFile
rm $BeforeFile $AfterFile
それではシェルスクリプトの内容を解説しよう。3~6行目はReg.exeが参照するレジストリキーやオプション、一時ファイル名を定義する変数だが、バックスラッシュ()はメタ文字として扱われるため、バックスラッシュ自体を現す2重表記を用いている。8行目はReg.exeを実行しているが、このままではWindows 10上で操作した際の違いをレジストリから探ることはできない。そのため9行目で、標準入力から読み込んで変数に格納するBashの内部関数「read」と、標準エラー出力にプロンプトを書き出す「-p」を使い、シェルスクリプトを一時停止。[Enter]キーを押すことで10行目の処理が行われる。後はファイルを比較する「diff」コマンドを11行目で実行し、13行目は一時ファイルの削除を後処理して実行している。
今回はひな形の状態としてシェルスクリプトを書いているため、diffの比較結果もそのまま標準出力に書き出している。「less」コマンドなどを使った方が見やすくなるはずだが、その辺りは次回以降の課題としよう。
阿久津良和(Cactus)