如何从 shell 脚本检查环境是否是 WSL?

如何从 shell 脚本检查环境是否是 WSL?

在 中.bashrc,我针对这样的特定环境进行了一些配置。

if [ "$(uname)" = 'Linux' ]; then
   . "$HOME/.bash.d/ubuntu"
fi

if [ "$(uname)" = 'Darwin' ]; then
   . "$HOME/.bash.d/osx"
fi

要了解当前环境是否处于西弗吉尼亚海岸,我使用/etc/wsl.conf通常只存在于WSL中的文件。

if [ -f "/etc/wsl.conf" ]; then
   . "$HOME/.bash.d/wsl"
fi

但当然,该文件也可以存在于其他环境中。

我应该如何检查当前环境是否在 WSL 中运行?

答案1

没有“万无一失”的方法,因为每种检测方法可以在某些情况下会导致误报或漏报。也就是说,如果您只是针对个人配置文件执行此操作,那么您可能很清楚给定的方法是否适合您的系统。

一些不同的方法,各有优缺点:

  • 的存在/proc/sys/fs/binfmt_misc/WSLInterop很好地表明您使用的是 WSL。这可能是最可靠的方法,Ubuntu 的 Snapd 项目也将其用作检测机制。此文件默认存在于 WSL1 和 WSL2 下。即使通过 禁用 Interop /etc/wsl.conf,WSL 启动时仍会创建此文件。

    注意事项:当然,binfmt_misc可以设置一个名为的条目WSLInterop,但那样做会非常不正常,导致假阳性测试。

    此外,它可以覆盖 Interop 的名称,如中所述我的 Ask Ubuntu 答案在这里。这是一个不寻常的情况,但我们用它来暂时阻止 Snapd WSL 检测,同时修复错误。当然,这会产生假阴性。

    在战争升级中,你可以通过在该目录中 grepping 来“阻止-the-thwarting” magic 4d5a,但这可能有点过分 ;-)

  • 作为@MBehrens 提到, 这默认WSL 下的内核名称包含字符串“Microsoft”(或“microsoft”,具体取决于版本)。使用uname -r/proc/version)可用于检测。

    注意事项:其他系统可能(我认为是 Azure)使用 Microsoft 构建的内核,这可能会产生误报。而且,有可能为 WSL2 构建一个具有不同名称的自定义内核,这会产生误报。

  • 您甚至可以只检查环境变量$WSL_DISTRO_NAME。此变量会自动注入到 WSL 环境中。

    注意事项:您始终可以(病态地)在任何系统上创建此变量名,从而导致误报。

    更重要的是,有些情况下这个变量会不是可用,例如如果你su - $USER

当然还有更多(例如查看是否$(which powershell.exe)可执行),但以上内容应该可以让您对各种方法有所了解。

答案2

检查输出

cat /proc/version

cat /proc/sys/kernel/osrelease

例如:

if [[ $(grep -i Microsoft /proc/version) ]]; then
echo "Bash is running on WSL"
fi

答案3

如果你启用了 systemd,你可以尝试

systemd-detect-virt

这应该返回

wsl

答案4

有点晚了,但在 WSL 下命令lscpu显示一行:

  • Hypervisor vendor: Windows Subsystem for Linux

它既以普通用户的身份执行此操作,也以 的身份执行此操作sudo su

相关内容