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

Respostas:


86

Você pode usar eval:

eval echo ~$USER

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


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 )

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

?


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`

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.