Obter diretório inicial por nome de usuário

84

Quero obter o diretório home de qualquer usuário com eco

echo ~puchuu
>> /home/puchuu

Mas eu não posso usar variável

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
puchu
fonte

Respostas:

86

Você pode usar eval:

eval echo ~$USER

Mas veja o comentário de Andrew e a resposta de Glenn abaixo.

choroba
fonte
8
No bash eval não é necessário-lo com apenas echo ~$usernameque está tudo bem, mas em sh é necessário eval se é uma variável
Felipe Alcacibar
Às vezes, isso gera um valor errado, talvez a pasta inicial de uma conta anterior com o mesmo nome de usuário?
Andrew
@AndrewMacFie: O que você quer dizer com "anterior"?
choroba 12/12
11
@choroba Adicione um usuário, exclua-o e adicione-o com o mesmo nome de usuário. Se a pasta pessoal do usuário for diferente na segunda vez, esse comando fornecerá a pasta pessoal original e não a atual. A resposta de Glenn Jackman fornece a atual.
Andrew
Observe também que se você eval echo "~$USER"estiver assumindo que $USERnão contém caracteres especiais que o shell possa interpretar. Por exemplo, se USER="foo\$bar", então quando nós evalo shell substituiremos $barna sua saída, o que não é o que você deseja. Basicamente, se você seguir esta rota, precisará garantir $USERuma entrada sã. Na maioria das vezes, provavelmente será, mas você deve ter isso em mente.
Zorawar
65

Isso pode funcionar para você:

homedir=$( getent passwd "$USER" | cut -d: -f6 )

Isso também funcionará em usuários que não são você. Por exemplo,

homedir=$( getent passwd "someotheruser" | cut -d: -f6 )
Glenn Jackman
fonte
Esta é legítimo, usando getenvem vez de assumir a localização de passwdé ainda um passo além do que assumindo a localização da casa é/home/
Evan Carroll
13

Parece que você é esse usuário - por que não

echo $HOME

?

greenoldman
fonte
3
Isso não funcionará se você estiver em um ambiente sudo'ed e não tiver passado os sinalizadores -H ou -i do sudo - $ HOME ainda será o diretório inicial do usuário anterior (sudo'ing).
Asfand Qazi
1

Não sei se ajuda, mas colocar o til fora da expressão funciona no ZSH, mas não no Bash:

echo ~`echo $USER`
Pedro Penna
fonte
0

Depois de fazer o login, execute cdpara ir para o diretório inicial e, em seguida, execute pwdpara imprimir o diretório de trabalho.

Vinoth Hari
fonte
Isso não vai funcionar; A idéia aqui é fazer isso no shell script, e presumivelmente sem exigir as credenciais do usuário em questão ...
Samb
-1 pelo mesmo motivo que SamB mencionou. Editei sua resposta porque quero que você veja como usar a formatação do Markdown e seja mais conciso. Você também perdeu o método muito mais fácil, que é justo echo $HOME.
wjandrea 4/09/16