Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBUW(Bash on Ubuntu on Windows)が動作し、各種Linuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。
Windows 10 SではWSLが動作しない?
Microsoftが2017年5月18日(現地時間)に投稿した公式ブログの記事によれば、同社が昨日発表した文教向けOSとなるWindows 10 SではWSLが動作しないそうだ。それどころか、WindowsコンソールやCmd(コマンドプロンプト)、PowerShell、Linux/Bash/WSLインスタンスなどすべて動作しない。これは不正なソフトウェアからWindows 10 Sを保護するために選択した仕様だという。
WSLについてMicrosoftは以前から「開発者向け機能」と説明していることから、文教向けOSであるWindows 10 Sで動作しないのは至極当然だ。またロジックは不明だが同社の説明を鑑みるとフロントエンドとなるコマンドプロンプト自体の起動を抑止しているため、関連する機能はすべて動作しないのだろう。だが、教育としてプログラムを学ぶ"プログラミング授業"の重要性が認識されつつある状況を踏まえると、Windows 10 SでもWSLをサポートした方が可能性は広がるのではないだろうか。
Windows 10とWSLのバージョンを取得する
さて、前回までは、「Office 365」に含まれる最新バージョンのOffice(=Office 2016)のバージョン情報をWeb上から取得するシェルスクリプトを取り上げてきたが、途中からWindows 10のレジストリを参照していた。この応用として作成したのが、今回のWindows 10とWSLのバージョンを取得するシェルスクリプトである。まずは任意のテキストエディターに以下の内容を入力し、必要に応じて出力先のパスなどを変更してから、chmodコマンドなどで実行権限を与えて動作を確認してほしい。
#!/bin/bash
IFS_Backup=$IFS
IFS=$'\n'
REGKey=HKLM\\SOFTWARE\\Microsoft\\Windows\ NT\\CurrentVersion
REGValue1=ReleaseId
REGValue2=CurrentBuild
REGValue3=UBR
ARRAY1=(`reg.exe query $REGKey /v $REGValue1`) 2>/dev/null
ARRAY2=(`reg.exe query $REGKey /v $REGValue2`) 2>/dev/null
ARRAY3=(`reg.exe query $REGKey /v $REGValue3`) 2>/dev/null
Version=(`echo ${ARRAY1[2]} | cut -c28- | sed -e 's/[\r\n]\+//g'`)
BuildNo=(`echo ${ARRAY2[2]} | cut -c31- | sed -e 's/[\r\n]\+//g'`)
UBR=(`echo ${ARRAY3[2]} | cut -c27- | sed -e 's/[\r\n]\+//g'`)
WSL=(`cat /etc/issue | cut -d ' ' -f 1-3`)
if [ ${#UBR} -eq 1 ] ; then
UBRdec=`printf '%d\n' '0x000'$UBR`
elif [ ${#UBR} -eq 2 ] ; then
UBRdec=`printf '%d\n' '0x00'$UBR`
elif [ ${#UBR} -eq 3 ] ; then
UBRdec=`printf '%d\n' '0x0'$UBR`
elif [ ${#UBR} -eq 4 ] ; then
UBRdec=`printf '%d\n' '0x'$UBR`
fi
echo 'Windows 10のバージョン:' $Version
echo 'Windows 10のビルド番号:' $BuildNo'.'$UBRdec
echo 'WSLの内容:' $WSL
IFS=$IFS_Backup
本シェルスクリプトを実行すると、Windows 10のレジストリから必要な情報を取得し、必要な情報だけを表示する。
シェルスクリプトの解説を行う前にWindows 10のレジストリについて少々述べておきたい。バージョン情報などは、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersionキーに並ぶ文字列値「ReleaseId」「CurrentBuild」、DWORD値「UBR」に格納されている。下図をご覧になるとお分かりのとおり、「ReleaseId」がバージョン情報、「CurrentBuild」は現在のメジャービルド番号、「UBR」がマイナービルド番号だ。
これらの情報をシェルスクリプトから「reg.exe」経由で取得しているのが、10~12行目の内容。13~16行目は各配列の内容をcutで編集し、sedで不要な改行を除去した。ちなみに16行目は単なるオマケだが、「/etc/issue」の内容からBUWの情報を取得し、同じく必要な情報だけを変数WSLに代入している。
今回扱いが面倒だったのがマイナービルド番号だ。reg.exe経由では「0x3e8」という文字列が取得できるが、表示すべき内容は16進数ではなく10進数である。このあたりはprintfのフォーマットを使えば難なく変換できるものの、本来与えるべき数値は「0x03e8」だ。そのため、18~26行目のif文で変数UBRの文字数に応じて文字列を追加している。今回はあまり業務に役立つシェルスクリプトではないものの、このような処理も行えるということでご紹介した。
阿久津良和(Cactus)