如何检查一个程序是否在Windows上的Ubuntu上运行,而不仅仅是简单的Ubuntu?

非常简单,找出你正在使用的操作系统的平常的地方似乎与Ubuntu for Windows上的普通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”

暂时这可能是最好的办法。 我不能保证我们永远不会改变这些ProcF文件的内容,但我认为我们不太可能将它改为不包含“Microsoft”或“WSL”的东西。

 /proc/sys/kernel/osrelease /proc/version 

我一直在寻找方法来检测。 到目前为止我找到了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编译。

我刚刚为我的.bashrc提供了一些WSL项目添加到$ PATH。

在1703年工作。不知道如果早期版本。

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