web-dev-qa-db-ja.com

単純なUbuntuだけでなく、Windows上のUbuntuのBashでプログラムが実行されているかどうかを確認する方法は?

非常に簡単ですが、現在使用しているOSを把握するための通常の場所は、Windows用のUbuntu上のプレーンなUbuntuと同じです。たとえば、uname -aはネイティブのGNU/Linuxインストールと同じで、/etc/os-versionはUbuntu Trusty Tahrインストールと同じです。

私が考えることができる唯一のことは、/mnt/c/Windowsが存在するかどうかを確認することですが、それが絶対確実なアイデアであるかどうかはわかりません。

30
DrKabob

以下は、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
32
Gary S. Weaver

それを検出する方法も探していました。これまでに見つけたのは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によってコンパイルされていないため、変更されます。

7
Adno

$ PATHにいくつかのWSLアイテムを追加するための.bashrcについてこれを思いついたところです。

1703年に動作します。以前のバージョンかどうかは不明です。

if [[ $(uname -r) =~ Microsoft$ ]]; then
    foo
fi
2
Ryan

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à。

1
GollyJer

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 ...

0
gregln

WSL2の場合、Hyper-Vで実際のLinuxカーネルを実行しているため、カーネルバージョンを検出できなくなりました。ただし、すべてのWindowsインストールに存在するExplorer.exeを呼び出すことができます。だから私たちは...

if [ -x "$(command -v Explorer.exe)" ]; then
echo "We are running on WSL"
fi

これは、スクリプトがWSLで実行されているかどうかを検出するより一般的な方法です。

編集:上記の回答を参照してください。 Msys2のようなUnixライクな環境をカウントするのを忘れていました。

0
march_happy

これが私が.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文字列を引き出します。
0
Dan

バッシュでforkを避けたい場合:

is_wsl=0
read os </proc/sys/kernel/osrelease || :
if [[ "$os" == *Microsoft ]]; then
  is_wsl=1
fi
0
gavenkoa

私が特別なことをしなければ、これらの環境変数はすでに設定されているようです:

$ 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は、変数が設定されているかどうかをチェックしません 、単にそれが空であることを確認します。実際には、これはこの場合十分に機能します。)

0
Per Lundberg