Як отримати домашній каталог користувача хоста в WSL Bash


6

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

echo $WINHOME

буде виводити щось подібне

/mnt/c/Users/dualed

Чи стане це якось можливим?

Коли я шукаю його, я знаходжу лише результати для протилежного (пошук шляху користувача LXSS від хоста)

У мене є запасна ідея витягання його з $PATH, оскільки є деякі передбачувані шляхи, подібні до тих, що містять AppData, але я вважаю за краще, якщо це можливо, просто.


Ні, тільки звичайні змінні Linux люблять HOME, PWD, USER, але всі вони посилаються на користувача Linux, а не на "хост" користувача Windows.
dualed

Мабуть дублікат stackoverflow.com/questions/44971719/…
dualed

Відповіді:


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 і Майкл Хоффман .


Ну, якщо бути точним $win_userprofile містить шлях вікна, $userprofile має відповідь на моє запитання, але так, що я шукав. Хоча я вважаю за краще перекласти з Windows шлях до шляху Unix, щоб бути менш залучені
dualed

Я тільки що знайшов github.com/Microsoft/WSL/issues/1834#issuecomment-346443730 "Windows Insider Build 17046 містить нову функціональність" wslpath ", яка підтримує переклади шляхів"
dualed

Відмінна відповідь. У мене було багато елементів, але у мене було дві проблеми. (1) Тому що я думав, що може знадобитися, я тестував кореневу sudo -s ) оболонки, і cmd.exe Я не був на моєму шляху, тому я шукав спосіб знайти свій шлях; в оболонці входу в систему це не потрібно. (2) Хоча cmd.exe /c echo %userprofile% дає шлях у Windows, я боровся з комплексом sed фільтри увімкнено mount або df на карті (DriveLetter): до шляху Linux; findmnt є дуже акуратним рішенням. Велике спасибі: багато чого я дізнався.
AFH

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

лише невелике попередження.


wslpath не є інструментом. Це лише символічне посилання (тобто м'яка посилання ln -s ) з /init файл в rootfs папки.
Biswapriyo

Так, здається /init є виконуваним wslpath, але він діє по-різному, коли його називають wslpath, так що я все одно закликаю інструмент wslpath і ні /init і також було оголошено, як wslpath від розробників: github.com/Microsoft/WSL/issues/1834#issuecomment-346443730
dualed

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, і (більш проблематично на мій погляд), що не існує шляху добору даних з іншими іменами користувачів, наприклад, в глобальній області і, нарешті, домашній каталог фактично встановлено /mnt.

Приклад виводу:

$ winhome
/mnt/c/Users/dualed

0

Припускаючи, що ви знаєте свій ідентифікатор користувача Windows, ви можете помістити це у свій .profile: експортувати WINHOME = $ (wslpath C: / Користувачі / подвійний)


I ні хочете, щоб hardcode шлях, в іншому випадку я міг би просто встановити шлях Unix безпосередньо. Також wslpath працює тільки в інсайдерських будівлях прямо зараз.
dualed

В ПОРЯДКУ. додайте ці два рядки до .profile:
rhmccullough

apps = $ (echo $ PATH | sed 's /: / n / g' | grep WindowsApps); експортувати WINHOME = $ {WINHOME %% / AppData *}
rhmccullough

oops: експортувати WINHOME = $ {apps %% / AppData *}
rhmccullough

Вищевказане буде невдалим, якщо в системі $ PATH буде більше одного WindowsApps. Найкраще створити однорядковий скрипт оболонки, що містить: echo "$ PATH" | sed 's /: / n / g' | grep WindowsApps | sed 's, / AppData. * ,, | сорт -у
rhmccullough

0

багато великої інформації тут! Дякую. Мені потрібно додаткове налаштування.

коли я використовую 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 не має нічого подібного -n варіант з bash echo , тому запозичення з посади StackOverflow ( Пакет Windows: ехо без нового рядка ), я додав псевдо-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

Ти намагався

env | grep '\&bsol;Users\&bsol; & lt; ім’я користувача & gt;  ' 
?

У Cygwin, я отримую

HOMEPATH=\Users&bsol; & lt; моє ім’я користувача & gt;  USERPROFILE = C: Користувачі & amp; bsol;  & lt; моє ім’я користувача & gt;  APPDATA = C: Користувачі & amp; bsol;  & lt; моє ім’я користувача & gt;  AppData Роумінг
LOCALAPPDATA = C: Користувачі & amp; bsol;  & lt; моє ім’я користувача & gt;  Локальні 
Звичайно, Cygwin не те ж саме, що WSL, але може бути легка відповідь, яка весь час перебувала під вашим носом.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.