В bash eval не нужен, просто echo ~$usernameвсе в порядке, но в sh eval нужен, если есть переменная
Felipe Alcacibar
Иногда это дает неправильное значение, может быть, домашняя папка предыдущей учетной записи с тем же именем пользователя?
Андрей
@AndrewMacFie: Что вы подразумеваете под «предыдущим»?
Чороба
1
@choroba Добавьте пользователя, удалите пользователя, затем добавьте пользователя с тем же именем пользователя. Если домашняя папка пользователя отличается во второй раз, эта команда дает исходную домашнюю папку, а не текущую. Ответ Гленна Джекмана дает текущий.
Андрей
Также обратите внимание, что если вы eval echo "~$USER"делаете предположение, что $USERоно не содержит специальных символов, которые может интерпретировать оболочка. Например, если USER="foo\$bar", тогда, когда мы evalбудем подставлять оболочку $barв ваш вывод, это не то, что вы хотите. По сути, если вы выберете этот маршрут, вам нужно убедиться, что $USERэто вменяемый ввод. В большинстве случаев это возможно, но вы должны помнить об этом.
Zorawar
65
Это может работать для вас:
homedir=$( getent passwd "$USER"| cut -d:-f6 )
Это также будет работать с пользователями, которые не являются вами. Например,
Это законно, если использовать, getenvа не предполагать, что местоположение passwdнаходится даже на шаг дальше, чем предполагать, что местоположение дома/home/
Это не будет работать, если вы находитесь в среде sudo и не указали sudo флаги -H или -i - $ HOME по-прежнему будет домашним каталогом предыдущего (sudo'ing) пользователя.
Асфанд Кази
1
Я не знаю, помогает ли это, но размещение тильды вне выражения работает на ZSH, но не на Bash:
Это не сработает; идея здесь состоит в том, чтобы сделать это в сценарии оболочки, и, по-видимому, не требуя учетных данных пользователя, о котором идет речь ...
SamB
-1 по той же причине, о которой говорил СамБ. Я отредактировал ваш ответ, потому что хочу, чтобы вы увидели, как использовать форматирование Markdown, и был более кратким. Вы также пропустили гораздо более простой метод, который просто echo $HOME.
echo ~$username
все в порядке, но в sh eval нужен, если есть переменнаяeval echo "~$USER"
делаете предположение, что$USER
оно не содержит специальных символов, которые может интерпретировать оболочка. Например, еслиUSER="foo\$bar"
, тогда, когда мыeval
будем подставлять оболочку$bar
в ваш вывод, это не то, что вы хотите. По сути, если вы выберете этот маршрут, вам нужно убедиться, что$USER
это вменяемый ввод. В большинстве случаев это возможно, но вы должны помнить об этом.Это может работать для вас:
Это также будет работать с пользователями, которые не являются вами. Например,
источник
getenv
а не предполагать, что местоположениеpasswd
находится даже на шаг дальше, чем предполагать, что местоположение дома/home/
Кажется, вы тот пользователь - почему бы и нет
?
источник
Я не знаю, помогает ли это, но размещение тильды вне выражения работает на ZSH, но не на Bash:
источник
После входа в систему запустите,
cd
чтобы перейти в свой домашний каталог, затем запустите,pwd
чтобы распечатать рабочий каталог.источник
echo $HOME
.