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,
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:
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.
echo ~$username
que está tudo bem, mas em sh é necessário eval se é uma variáveleval echo "~$USER"
estiver assumindo que$USER
não contém caracteres especiais que o shell possa interpretar. Por exemplo, seUSER="foo\$bar"
, então quando nóseval
o shell substituiremos$bar
na sua saída, o que não é o que você deseja. Basicamente, se você seguir esta rota, precisará garantir$USER
uma entrada sã. Na maioria das vezes, provavelmente será, mas você deve ter isso em mente.Isso pode funcionar para você:
Isso também funcionará em usuários que não são você. Por exemplo,
fonte
getenv
em vez de assumir a localização depasswd
é ainda um passo além do que assumindo a localização da casa é/home/
Parece que você é esse usuário - por que não
?
fonte
Não sei se ajuda, mas colocar o til fora da expressão funciona no ZSH, mas não no Bash:
fonte
Depois de fazer o login, execute
cd
para ir para o diretório inicial e, em seguida, executepwd
para imprimir o diretório de trabalho.fonte
echo $HOME
.