Как узнать имя текущего пользователя Windows из гостевой Ubuntu?
ПК под Windows(11). В WSL(2) запускается Ubuntu(24.04). В ней запускается скрипт, которому нужен подкаталог (папка) домашнего каталога текущего пользователя Windows (пользователей несколько). То есть для пользователя Windows user1 скрипт должен использовать find /mnt/c/Users/user1/Pictures/ ..., а для пользователя user2 использовать find /mnt/c/Users/user2/Pictures/ .... Как?
Ответы (2 шт):
Путь к домашней папке windows-юзера находится в windows-переменной USERPOFILE
Эту переменную можно прочитать командой cmd.exe /c 'echo %USERPROFILE%' | tr -d '\r'
Пути Windows можно преобразовать в путь WSL командой wslpath. Итого, как сохранить путь к домашнему каталогу пользователя в переменную WINPROFILE
WINPROFILE=$(wslpath "$(cmd.exe /c 'echo %USERPROFILE%' | tr -d '\r')")
Затем
find "$WINPROFILE/Pictures" ...
UPDATE 1
Как оказалось, если cmd.exe вызывать из каталога, который не является каталогом Windows (я свои примеры запускал в каталоге /c/mnt/Users/User), то cmd.exe начинает ругаться:
$ cmd.exe /c 'echo %USERPROFILE%'
'\\wsl.localhost\Ubuntu\home\user'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
C:\Users\User
Чтобы подавить вывод сообщения об ошибке, то стоит перенаправить stderr в /dev/null:
WINPROFILE=$(wslpath "$(cmd.exe /c 'echo %USERPROFILE%' 2>/dev/null | tr -d '\r')")
Update 2
Довольно опасно рассчитывать, что папка Изображения находится в %USERPROFILE%\Pictures. Она может оказаться где угодно, так как Windows позволяет переносить known-folders внутри файловой системы. Путь к фактическому местоположению этого каталога можно получить из powershell:
powershell.exe -NoProfile -Command "[Environment]::GetFolderPath('MyPictures')"
Сохранить путь к каталогу Изображения текущего пользователя в переменную WINPIC
WINPIC=$(wslpath "$(powershell.exe -NoProfile -Command '[Environment]::GetFolderPath(39)')")
Здесь магическая константа 39 соответствует папке Изображения (aka MyPictures). Вот полный список особых папок, которые поддерживает Environment.GetFolderPath
Альтернативным способом передачи переменной среды из Windows в Linux может быть служебная переменная среды WSLENV. Если присвоить её значение "USERPROFILE/up", то переменная среды USERPROFILE будет перенесена из Windows в Linux с трансляцией формата пути автоматически.
Недостатком данного способа является то, что она должна быть настроена до перехода Windows-Linux, то есть в скрипте на стороне WSL редактировать её уже поздно. Настраивать её проще всего в списке системных переменных:
Так же можно использовать пакетный файл на стороне Windows:
@echo off
set WSLENV=%WSLENV%:USERPROFILE/up
wsl путь/к/скрипту
