Ответы:
eval echo "~$USER"делаете предположение, что $USERоно не содержит специальных символов, которые может интерпретировать оболочка. Например, если USER="foo\$bar", тогда, когда мы evalбудем подставлять оболочку $barв ваш вывод, это не то, что вы хотите. По сути, если вы выберете этот маршрут, вам нужно убедиться, что $USERэто вменяемый ввод. В большинстве случаев это возможно, но вы должны помнить об этом.
Это может работать для вас:
homedir=$( getent passwd "$USER" | cut -d: -f6 )
Это также будет работать с пользователями, которые не являются вами. Например,
homedir=$( getent passwd "someotheruser" | cut -d: -f6 )
getenvа не предполагать, что местоположение passwdнаходится даже на шаг дальше, чем предполагать, что местоположение дома/home/
Кажется, вы тот пользователь - почему бы и нет
echo $HOME
?
Я не знаю, помогает ли это, но размещение тильды вне выражения работает на ZSH, но не на Bash:
echo ~`echo $USER`
После входа в систему запустите, cdчтобы перейти в свой домашний каталог, затем запустите, pwdчтобы распечатать рабочий каталог.
echo $HOME.
echo ~$usernameвсе в порядке, но в sh eval нужен, если есть переменная