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

dua*_*led 12 windows-subsystem-for-linux

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

echo $WINHOME
Run Code Online (Sandbox Code Playgroud)

会输出类似的东西

/mnt/c/Users/dualed
Run Code Online (Sandbox Code Playgroud)

这会以某种方式可能吗?

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

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

fel*_*crs 12

随着wslpathwslvar

$ wslpath "$(wslvar USERPROFILE)"
/mnt/c/Users/felipesantos
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过“sudo apt install --no-install-recommends wslu”安装它,以摆脱大多数依赖项(可能是由于您的讨论,idk) (6认同)
  • 从 Ubuntu 22.04 开始,默认情况下**不**安装包含“wslvar”的包“wslu”。更糟糕的是:它的安装需要安装 61 个软件包,占用 177 MB 磁盘空间。请参阅我打开的讨论:[限制Ubuntu中wslu包的依赖](https://github.com/wslutilities/wslu/discussions/235) (4认同)
  • 但是,默认情况下 WSL 中未安装 `wslvar` (3认同)
  • 根据 https://github.com/wslutilities/wslu#ubuntu,`wslvar` 已预安装在 Ubuntu 发行版中。不过,我不确定“wslpath”。好像是在Windows 10 v1803中引入的:https://devblogs.microsoft.com/commandline/windows10v1803/ (2认同)

pab*_*ouk 9

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

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

setx WSLENV USERPROFILE/up
Run Code Online (Sandbox Code Playgroud)

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

setx WSLENV USERPROFILE/u
Run Code Online (Sandbox Code Playgroud)

如果需要传输多个变量,请用冒号分隔它们。更多细节:


我在函数中使用该变量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
}
Run Code Online (Sandbox Code Playgroud)


har*_*ymc 5

您可以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//\\//}"
Run Code Online (Sandbox Code Playgroud)

资料来源:微软的Craig LoewenMichael Hoffman


归档时间:

查看次数:

11087 次

最近记录:

5 年 前