非常に簡単ですが、現在使用しているOSを把握するための通常の場所は、Windows用のUbuntu上のプレーンなUbuntuと同じです。たとえば、uname -a
はネイティブのGNU/Linuxインストールと同じで、/etc/os-version
はUbuntu Trusty Tahrインストールと同じです。
私が考えることができる唯一のことは、/mnt/c/Windows
が存在するかどうかを確認することですが、それが絶対確実なアイデアであるかどうかはわかりません。
以下は、Windows 10、macOS、およびLinuxのbashで機能します。
#!/bin/bash
set -e
if grep -qE "(Microsoft|WSL)" /proc/version &> /dev/null ; then
echo "Windows 10 Bash"
else
echo "Anything else"
fi
WSL開発者、Ben Hillisによる このコメント に従って、「Microsoft」と「WSL」の両方を確認する必要があります。
当分の間、これはおそらくそれを行うための最良の方法です。これらのProcFsファイルの内容を決して変更しないとは約束できませんが、「Microsoft」または「WSL」を含まないものに変更することはまずないと思います。
/proc/sys/kernel/osrelease /proc/version
それを検出する方法も探していました。これまでに見つけたのは2。
/proc/sys/kernel/osrelease
は「3.4.0-Microsoft」です
/proc/version
は「Linuxバージョン3.4.0-Microsoft([email protected])(gccバージョン4.7(GCC))#1 SMP PREEMPT Wed Dec 31 14:42:53 PST 2014」
デフォルトでインストールされたUbuntuディストリビューションを使用するだけであれば、使用に問題はありません 「Microsoft」または「WSL」を含まないものに設定する可能性は低いと言われています 。
ただし、別のLinuxディストリビューションをインストールする場合は、/proc/sys/kernel/osrelease
および/proc/version
は、ディストリビューションがMicrosoftによってコンパイルされていないため、変更されます。
$ PATHにいくつかのWSLアイテムを追加するための.bashrcについてこれを思いついたところです。
1703年に動作します。以前のバージョンかどうかは不明です。
if [[ $(uname -r) =~ Microsoft$ ]]; then
foo
fi
Windows Subsystem for Linux 2
に加えてmacOS
をテストする必要がありました。
これは私たちにとって最も簡単なことです。
if [[ $OSTYPE == darwin* ]]; then
# macOS
Elif [[ "$(</proc/sys/kernel/osrelease)" == *Microsoft* ]]; then
# WSL2
else
# Other *nix distro.
fi
注:if
の順序が重要です。 macOSでは、proc/version
を見るとこのエラーが発生します。
/ proc/version:そのようなファイルまたはディレクトリはありません
正しいWSLチェックに向けて私を目指すためのトップアンサーのコメントのハットチップ@Niklas Holmと@MarcCornellà。
Windows 10 Pro Insider Preview Build 18917のLinux 2用Windowsサブシステム(WSL 2)
/ proc/versionには以下が含まれます:
Linuxバージョン4.19.43-Microsoft標準(oe-user @ oe-Host)(gccバージョン7.3.0(GCC))#1 SMP ...
WSL2の場合、Hyper-Vで実際のLinuxカーネルを実行しているため、カーネルバージョンを検出できなくなりました。ただし、すべてのWindowsインストールに存在するExplorer.exe
を呼び出すことができます。だから私たちは...
if [ -x "$(command -v Explorer.exe)" ]; then
echo "We are running on WSL"
fi
これは、スクリプトがWSLで実行されているかどうかを検出するより一般的な方法です。
編集:上記の回答を参照してください。 Msys2のようなUnixライクな環境をカウントするのを忘れていました。
これが私が.bashrcに入れたものです
if [[ $(uname -v | sed -rE 's/^#[0-9]{3,}-(\S+).+/\1/') == "Microsoft" ]]; then
# WSL-specific code
fi
uname -v
は#379-Microsoft Wed Mar 06 19:16:00 PST 2019
の形式でカーネルバージョンを取得し、sed式はMicrosoft
文字列を引き出します。バッシュでfork
を避けたい場合:
is_wsl=0
read os </proc/sys/kernel/osrelease || :
if [[ "$os" == *Microsoft ]]; then
is_wsl=1
fi
私が特別なことをしなければ、これらの環境変数はすでに設定されているようです:
$ set | grep WSL
IS_WSL='Linux version 4.4.0-18362-Microsoft ([email protected]) (gcc version 5.4.0 (GCC) ) #1-Microsoft Mon Mar 18 12:02:00 PST 2019'
WSLENV=
WSL_DISTRO_NAME=Debian
したがって、次のスニペットのようなものもこのケースで機能するはずです(私が自分のために使用した例):
if [ ! -z "$IS_WSL" ]; then
alias code='/mnt/c/Users/per/AppData/Local/Programs/Microsoft\ VS\ Code/Code.exe'
fi
(技術的には -z
は、変数が設定されているかどうかをチェックしません 、単にそれが空であることを確認します。実際には、これはこの場合十分に機能します。)