6

Я хочу получить домашний каталог пользователя Windows "host" изнутри bash, поэтому моя теоретическая переменная среды (или программа)

echo $WINHOME

будет выводить что-то вроде

/mnt/c/Users/dualed

Будет ли это как-то возможно?

Когда я ищу его, я нахожу результаты только для противоположного (нахождение пути пользователя LXSS от хоста)

У меня есть запасная идея извлечь его из $PATH , так как есть некоторые предсказуемые пути, такие как те, которые содержат AppData , но я бы предпочел сделать это простым, если это возможно.

6 ответов6

4

Вы можете запустить 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//\\//}"

Источники: Крейг Лоуэн из Microsoft и Майкл Хоффман.

2

С моего написанием этого вопроса, инструментом wslpath был добавлен в WSL/LXSS. Этот инструмент может переводить пути окон в соответствующие правильные (?) точка монтирования в подсистеме Linux, поэтому самым простым решением было бы сейчас:

export WINHOME=$(wslpath $(cmd.exe /C "echo %USERPROFILE%"))
# echo $WINHOME prints something like /mnt/c/Users/dualed

Кроме того, теперь представляется возможным каскадное окружение, так что теперь это также опция:

export WINHOME=$(cmd.exe /C "cd /D %USERPROFILE% && bash.exe -c pwd")

PS: инструмент wslpath выглядит крайне альфа:

man wslpath
# No manual entry for wslpath
# See 'man 7 undocumented' for help when manual pages are not available.
wslpath /?
# wslpath: /?: Invalid argument
wslpath -?
# wslpath: unrecognized option: ?
# wslpath: Invalid argument
wslpath --help
# wslpath: unrecognized option: -
# wslpath: Invalid argument
wslpath
# wslpath: Invalid argument

просто небольшое предупреждение.


Надеюсь, полезное обновление: в настоящее время я использую небольшой помощник для получения переменных среды Windows

#!/bin/bash
# 'winenv'
cmd.exe /C "echo %$*%" | tr -d '\r'

И используя это как:

WINHOME=$(wslpath "$(winenv USERPROFILE)")
1

Это мой справочный ответ, если вопрос не будет отвечать в данный момент или неясен. Он делает то, что я написал в вопросе, который я хотел избежать - угадывая домашний каталог пользователя, ища поля, содержащие AppData (и немного больше) в $PATH

#!/bin/bash
IFS=':' read -a fields <<<"$PATH"

for field in "${fields[@]}"; do
        if [[ $field =~ ^(/mnt/.*)/AppData/Local/.* ]]; then
                echo ${BASH_REMATCH[1]}
                exit
        fi
done

Конечно, требуется, чтобы в %APPDATA% в Windows был хотя бы один путь и (на мой взгляд, более проблематично), чтобы не был задан путь AppData с другими именами пользователей, например, в глобальной области, и, наконец, домашний каталог на самом деле монтируется в /mnt .

Пример вывода:

$ winhome
/mnt/c/Users/dualed
1

много отличной информации здесь! Благодарю. мне нужен был дополнительный твик ..

Когда я использую трюк cmd.exe в моем файле .bash_aliases , я получаю ошибки из-за нежелательных символов новой строки из эха CMD, который wslpath проходит через:

$ echo $(cmd.exe /C "echo %USERPROFILE%") | cat -A
C:\Users\myself^M$
               ^-- no good, wslpath turns into /mnt/c/Users/myself^M$

В CMD echo, похоже, нет ничего похожего на опцию -n из bash echo, поэтому, заимствуя из сообщения StackOverflow (пакет Windows: echo без перевода строки), я добавил псевдо-chomp, чтобы удалить их:

$ echo $(cmd.exe /C "echo | set /p _=%USERPROFILE%") | cat -A
C:\Users\myself
               ^-- all gone!

и теперь мой псевдоним счастлив:

export WINHOME="$(wslpath $(cmd.exe /C "echo | set /p _=%USERPROFILE%"))"
0

Предполагая, что вы знаете свой идентификатор пользователя Windows, вы можете поместить его в свой .profile: export WINHOME = $(wslpath C:/Users/dualed)

0

Ты пытался

env | grep '\&bsol;Users\&bsol;<your-username>'
?

В Cygwin я получаю

HOMEPATH=\Users&bsol;<my-username>
USERPROFILE=C:\Users&bsol;<my-username>
APPDATA=C:\Users&bsol;<my-username>\AppData\Roaming
LOCALAPPDATA=C:\Users&bsol;<my-username>\AppData\Local
Конечно, Cygwin - не то же самое, что WSL, но может быть простой ответ, который был у вас под носом все это время.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .