如何在 WSL Bash 中获取主机用户主目录

如何在 WSL Bash 中获取主机用户主目录

我想从 bash 中获取 Windows“主机”用户主目录,因此我的理论环境变量(或程序)

echo $WINHOME

会输出类似

/mnt/c/Users/dualed

这有可能吗?

当我搜索它时,我只找到相反的结果(从主机查找 LXSS 用户路径)

我有一个从中提取它的后备想法$PATH,因为有一些可预测的路径,比如包含的路径AppData,但如果可能的话,我宁愿保持简单。

答案1

拥有wslpathwslvar

$ wslpath "$(wslvar USERPROFILE)"
/mnt/c/Users/felipesantos

答案2

幸运的是,自 Windows 10 build 17063(包含在 Windows 10 1803 中)以来,在 Windows 和 WSL 之间共享环境变量的更直接的方法 - WSLENV

为了使其%USERPROFILE%在 WSL 中可访问,您需要在变量中列出变量名称WSLENV。如果您尚未使用WSLENV,则只需在会话中运行以下命令一次cmd.exe。该命令setx将变量永久写入 Windows 注册表中的主环境:

setx WSLENV USERPROFILE/up

WSLENV设置将使 WSL%USERPROFILE%像在 WSL shell 中一样从 Windows 访问$USERPROFILE。Windows 目录路径将转换为 Unix 格式。如果您不想转换路径,只需省略p

setx WSLENV USERPROFILE/u

如果需要传输多个变量,请用冒号分隔。更多详细信息:


我在我的函数中使用了变量cdw(cd 到 Windows 路径)。我~/.bash_aliases在 Ubuntu 中自动执行的函数中定义了它:

#!/bin/bash

cdw () {
        if test "$#" -eq 0 ; then
                cd "$USERPROFILE"
        elif test "$1" = - ; then
                cd "$1"
        else
                cd -- "$(wslpath "$@")"
        fi
}

答案3

您可以cmd.exe从 bash 启动以获取主机环境变量。下面win_userprofile是您的答案,其他变量是为了完整性。

win_userprofile="$(cmd.exe /c "<nul set /p=%UserProfile%" 2>/dev/null)"

win_userprofile_drive="${win_userprofile%%:*}:"
userprofile_mount="$(findmnt --noheadings --first-only --output TARGET "$win_userprofile_drive")"

win_userprofile_dir="${win_userprofile#*:}"

userprofile="${userprofile_mount}${win_userprofile_dir//\\//}"

资料来源:克雷格·洛文在微软和 迈克尔·霍夫曼

答案4

/mnt/c/Users/"$(wslvar USERNAME)"

西弗吉尼亚大学- Windows 10 Linux 子系统的实用程序集合,例如检索 Windows 10 环境变量或在 Windows 10 桌面上创建您最喜欢的 Linux GUI 应用程序快捷方式。

需要 Windows 10 Creators Update;某些功能需要更高版本的 Windows 10;支持 WSL2。

相关内容