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を保護するために選択した仕様だという。

Windows 10 Sのデスクトップ画面。Desktop BridgeでAppx形式に変換したデスクトップアプリは動作する

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 Insider Previewでシェルスクリプトを実行した状態。バージョン情報およびビルド番号を表示する

こちらはWindows 10 バージョン1703上でシェルスクリプトを実行。サブマシンでメンテナンスを怠っているせいか、BUWのバージョンが少々古い

シェルスクリプトの解説を行う前にWindows 10のレジストリについて少々述べておきたい。バージョン情報などは、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersionキーに並ぶ文字列値「ReleaseId」「CurrentBuild」、DWORD値「UBR」に格納されている。下図をご覧になるとお分かりのとおり、「ReleaseId」がバージョン情報、「CurrentBuild」は現在のメジャービルド番号、「UBR」がマイナービルド番号だ。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersionキーの内容

これらの情報をシェルスクリプトから「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)