如何检查程序是否在Windows上的Ubuntu上运行Bash而不仅仅是普通的Ubuntu?

DrK*_*bob 27 linux windows bash ubuntu windows-subsystem-for-linux

非常简单,通常的地方找出你所使用的操作系统似乎与Ubuntu for Windows上的普通Ubuntu相同.例如uname -a,与本机GNU/Linux安装/etc/os-version相同,与Ubuntu Trusty Tahr安装相同.

我唯一能想到的就是检查是否/mnt/c/Windows存在,但我不确定这是否是一个万无一失的想法.

Gar*_*ver 32

以下适用于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
Run Code Online (Sandbox Code Playgroud)

你需要根据这个评论来检查"微软"和"WSL",由Ben Hillis,WSL开发人员:

目前,这可能是最好的方法.我不能保证我们永远不会改变这些ProcF文件的内容,但我认为我们不太可能将其改为不包含"Microsoft"或"WSL"的内容.

/proc/sys/kernel/osrelease
/proc/version
Run Code Online (Sandbox Code Playgroud)

  • 评论补充说,在 WSL 2 中,它显示“microsoft”,全部小写。 (7认同)
  • 不需要grep,`if [[“ $(</ proc / version)” == * @(Microsoft | WSL)*]]; 然后...`更快。 (2认同)

Shi*_*hah 9

@per-lundberg 更新答案:

if [[ -n "$IS_WSL" || -n "$WSL_DISTRO_NAME" ]]; then
    echo "This is WSL"
else
    echo "This is not WSL"
fi
Run Code Online (Sandbox Code Playgroud)

注意:IS_WSL存在于旧版本中(使用lxrun),而WSL_DISTRO_NAME存在于当前版本中(来自 Microsoft Store)。

  • 我不知道“$IS_WSL”。我刚刚测试过,对于 WSL2/Kali 中的非 root 用户来说它似乎仍然存在,但 WSL2/Ubuntu 中则不存在。并且不适用于任何这些 WSL2 发行版中的 root 用户。 (2认同)
  • @AJM 啊,我想知道 `$IS_WSL` 来自哪里——我自己没有它,所以我不确定为什么人们将它指向有效变量。一般来说,这是一个“不好”的使用方式,因为它在大多数 WSL 发行版中默认不存在。此外,“$WSL_DISTRO_NAME”也存在问题,因为它不仅不适用于 root 用户,而且不适用于通过 PAM 启动 shell 的*任何*用户。例如,“su - $USER”将创建一个没有“$WSL_DISTRO_NAME”的登录会话。尽管这是得票最高的答案,但它有很多可能会崩溃的极端情况。 (2认同)

Adn*_*dno 7

我一直在寻找检测它的方法.到目前为止,我发现了2.

  • /proc/sys/kernel/osrelease 是"3.4.0-Microsoft"

  • /proc/version 是"Linux版本3.4.0-Microsoft(Microsoft@Microsoft.com)(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编译.


Rya*_*yan 5

我刚刚为我的 .bashrc 想出了这个,用于向 $PATH 添加一些 WSL 项目。

适用于 1703。不确定是否为早期版本。

if [[ $(uname -r) =~ Microsoft$ ]]; then
    foo
fi
Run Code Online (Sandbox Code Playgroud)