シェルの実行環境が WSL でかどうかを判別する方法をいくつかまとめました。確認した環境は以下のとおりです。
- Ubuntu 16.04 (Windows 10 Creators Update)
- bash
$PATH 系
cmd.exe
Windows のシェルである cmd.exe
に PATH が通っているかどうかで判定する方法です。cmd.exe
のように拡張子まで指定する必要があるので注意しましょう。
$ which cmd.exe
/mnt/c/Windows/System32/cmd.exe
windows/system32
同様に、Windows の大事なコマンドが格納されるフォルダである C:\windows\system32
フォルダに PATH が通っているかどうかで判別する方法です。ドライブレターは環境によって変わる可能性があるので省略しています。
$ echo $PATH | grep -i 'windows/system32'
...(略)...
/mnt/c/Windows/System32
ファイルシステム系
C ドライブがマウントされているか
Windows のドライブをマウントするファイルシステム (なのか?) である drvfs
によって C ドライブがマウントされているかどうかで判別する方法です。ドライブレターは環境によって変わる可能性があります。
$ mount | grep -i 'drvfs'
C: on /mnt/c type drvfs (rw,noatime)
/proc/sys/fs/binfmt_misc/WSLInterop が存在するか
WSLInterop
ファイルが存在するかどうかで判別する方法です。
$ if [ -f /proc/sys/fs/binfmt_misc/WSLInterop ]; then \
> echo 'WSL'; \
> fi
WSL
‘Microsoft’ が含まれるかどうか系
uname -r
uname -r
の結果に Microsoft
が含まれるかどうかで判別する方法です。
$ uname -r | grep -i 'microsoft'
4.4.0-43-Microsoft
/proc/version
同様に、/proc/version
に Microsoft
が含まれるかどうかで判別する方法です。
$ cat /proc/version | grep -i 'microsoft'
Linux version 4.4.0-43-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #1-Microsoft W
ed Dec 31 14:42:53 PST 2014
/proc/version_signature
/proc/version_signature
に Microsoft
が (ry
$ cat /proc/version_signature | grep -i 'microsoft'
Microsoft 4.4.0-43-Microsoft 4.4.35
/proc/sys/kernel/osrelease
/proc/sys/kernel/osrelease
に (ry
$ cat /proc/sys/kernel/osrelease | grep -i 'microsoft'
4.4.0-43-Microsoft
まとめ
uname -r
を見るのは王道という感じがしますね。スクリプトの中で使うなら /proc/sys/fs/binfmt_misc/WSLInterop
の存在をチェックするのが良さそうです。他のコマンドを呼び出さなくてすむので。
目的にあった方法を使い分けましょう。
参考
以下の issue を参考にいくつか付け加えました。
Provide a way to positively detect WSL from an app compiled on Linux.