Como obter o diretório inicial do usuário do host no WSL Bash

5

Eu quero obter o diretório home do usuário "host" do Windows a partir do bash, então minha variável de ambiente teórica (ou programa)

echo $WINHOME

produziria algo como

/mnt/c/Users/dualed

Isso seria de alguma forma possível?

Quando procuro, só encontro resultados para o oposto (encontrar o caminho do usuário LXSS do host)

Eu tenho uma idéia alternativa de extraí-lo de $PATH , pois há alguns caminhos previsíveis como aqueles que contêm AppData , mas eu prefiro mantê-lo simples, se possível.

    
por dualed 23.11.2017 / 18:42

4 respostas

1

Desde que escrevi esta pergunta, a ferramenta wslpath foi adicionada ao WSL / LXSS. Essa ferramenta pode traduzir caminhos do Windows para o ponto de montagem correto (?) No subsistema Linux, portanto, a solução mais fácil seria agora:

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

Além disso, agora parece possível criar ambientes em cascata, então agora também é uma opção:

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

PS: A ferramenta wslpath parece extremamente alfa:

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

apenas um pequeno aviso.

    
por 17.07.2018 / 00:14
4

Você pode lançar cmd.exe do bash para obter as variáveis de ambiente do host. A seguir, win_userprofile tem sua resposta e as outras variáveis são para ser completos.

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//\//}"

Fontes: Craig Loewen na Microsoft e Michael Hoffman .

    
por 23.11.2017 / 21:43
1

Esta é a minha resposta de referência , se a pergunta não puder ser respondida no momento ou não estiver clara. Ele faz o que eu escrevi na pergunta que eu queria evitar - adivinhando o diretório pessoal do usuário procurando por campos contendo AppData (e um pouco mais) dentro de $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

Exige, é claro, que haja pelo menos um caminho em %APPDATA% no Windows e (mais problemático na minha opinião) que não há um caminho AppData definido com outros nomes de usuário, por exemplo, no escopo global e, finalmente, que o diretório inicial é montado em /mnt .

Exemplo de saída:

$ winhome
/mnt/c/Users/dualed
    
por 23.11.2017 / 20:46
0

Assumindo que você conhece o seu ID de usuário do Windows, você pode colocar isso no seu .profile: exportar WINHOME = $ (wslpath C: / Users / dualed)

    
por 24.11.2017 / 05:28