注: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/System32
Windows のドライブをマウントするファイルシステム (なのか?) である 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
WSL
uname -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-Microsoft
uname -r
を見るのは王道という感じがしますね。スクリプトの中で使うなら /proc/sys/fs/binfmt_misc/WSLInterop
の存在をチェックするのが良さそうです。他のコマンドを呼び出さなくてすむので。
目的にあった方法を使い分けましょう。
以下の issue を参考にいくつか付け加えました。
Provide a way to positively detect WSL from an app compiled on Linux.