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


84

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

echo ~puchuu
>> /home/puchuu

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

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu

Ответы:


86

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

eval echo ~$USER

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


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

?


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

1

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

echo ~`echo $USER`

0

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


Это не сработает; идея здесь состоит в том, чтобы сделать это в сценарии оболочки, и, по-видимому, не требуя учетных данных пользователя, о котором идет речь ...
SamB

-1 по той же причине, о которой говорил СамБ. Я отредактировал ваш ответ, потому что хочу, чтобы вы увидели, как использовать форматирование Markdown, и был более кратким. Вы также пропустили гораздо более простой метод, который просто echo $HOME.
wjandrea
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.