[shell] WSL かどうかを判別する

シェルの実行環境が 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/versionMicrosoft が含まれるかどうかで判別する方法です。

$ 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_signatureMicrosoft が (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.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です