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