![如何在 WSL Bash 中获取主机用户主目录](https://linux22.com/image/1546892/%E5%A6%82%E4%BD%95%E5%9C%A8%20WSL%20Bash%20%E4%B8%AD%E8%8E%B7%E5%8F%96%E4%B8%BB%E6%9C%BA%E7%94%A8%E6%88%B7%E4%B8%BB%E7%9B%AE%E5%BD%95.png)
我想从 bash 中获取 Windows“主机”用户主目录,因此我的理论环境变量(或程序)
echo $WINHOME
会输出类似
/mnt/c/Users/dualed
这有可能吗?
当我搜索它时,我只找到相反的结果(从主机查找 LXSS 用户路径)
我有一个从中提取它的后备想法$PATH
,因为有一些可预测的路径,比如包含的路径AppData
,但如果可能的话,我宁愿保持简单。
答案1
拥有wslpath
和wslvar
:
$ 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
如果需要传输多个变量,请用冒号分隔。更多详细信息:
- https://docs.microsoft.com/en-us/windows/wsl/interop#share-environment-variables-between-windows-and-wsl
- https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows/
我在我的函数中使用了变量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。