在 中.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
。