Получить домашний каталог по имени пользователя

84

Я хочу получить домашний каталог любого пользователя с эхо

echo ~puchuu
>> /home/puchuu

Но я не могу использовать переменную

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
puchu
источник

Ответы:

86

Вы можете использовать eval:

eval echo ~$USER

Но см. Комментарий Эндрю и ответ Гленна ниже.

choroba
источник
8
В 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 )

Это также будет работать с пользователями, которые не являются вами. Например,

homedir=$( getent passwd "someotheruser" | cut -d: -f6 )
Гленн Джекман
источник
Это законно, если использовать, getenvа не предполагать, что местоположение passwdнаходится даже на шаг дальше, чем предполагать, что местоположение дома/home/
Эван Кэрролл
13

Кажется, вы тот пользователь - почему бы и нет

echo $HOME

?

greenoldman
источник
3
Это не будет работать, если вы находитесь в среде sudo и не указали sudo флаги -H или -i - $ HOME по-прежнему будет домашним каталогом предыдущего (sudo'ing) пользователя.
Асфанд Кази
1

Я не знаю, помогает ли это, но размещение тильды вне выражения работает на ZSH, но не на Bash:

echo ~`echo $USER`
Педро Пенна
источник
0

После входа в систему запустите, cdчтобы перейти в свой домашний каталог, затем запустите, pwdчтобы распечатать рабочий каталог.

Винот Хари
источник
Это не сработает; идея здесь состоит в том, чтобы сделать это в сценарии оболочки, и, по-видимому, не требуя учетных данных пользователя, о котором идет речь ...
SamB
-1 по той же причине, о которой говорил СамБ. Я отредактировал ваш ответ, потому что хочу, чтобы вы увидели, как использовать форматирование Markdown, и был более кратким. Вы также пропустили гораздо более простой метод, который просто echo $HOME.
wjandrea