Відповіді:
Існує утиліта, яка буде шукати інформацію користувачів, незалежно від того, зберігається ця інформація в локальних файлах, таких як /etc/passwd
або в LDAP або іншому методі. Це називається getent
.
Для того, щоб вивести з нього інформацію про користувача, ви запустите getent passwd $USER
. Ви отримаєте рядок назад, який виглядає так:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Тепер ви можете просто вирізати з нього домашній директор, наприклад, використовуючи нарізку, наприклад:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
зі змінними в bash
. Не безпосередньо, все одно.
~
дійсно здається вкладка-розширення, хоча і інший білд поведінку тильди-префікс має бути замінено на ім'я шляхом первісного робочого каталогу , пов'язаний з ім'ям користувача , отриманим з допомогою getpwnam()
функції і тому , ймовірно , що пошук дуже добре. Мені не подобаються розширення табуляцій, хоча - я люблю вводити вкладки.
Ви можете використовувати eval
для отримання домашнього каталогу когось.
eval echo "~$USER"
Принаймні для місцевих користувачів це працює точно. Я не знаю, чи обробляються віддалені користувачі, такі як LDAP eval
.
eval
потрібен. Bash не обробляється ~foo
після змінного розширення.
USER
.
$USER
розширюється лише на один рядок алфавітних символів.
Звичайне місце є /home/$USER
, але це не повинно бути універсальним. Визначальне місце для пошуку такої інформації знаходиться всередині файлу /etc/passwd
.
Цей файл читається у всьому світі (кожен може прочитати його), тому будь-який користувач має доступ до його вмісту.
Якщо у файлі існує $ USER, попередній та останній запис - це HOME-користувач.
Це дозволить вибрати запис та надрукувати каталог HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Для більш складних (віддалених) систем getent - це звичайна команда для отримання інформації про користувачів з системи NSS (Name Service Switch Library).
Команда
echo $(getent passwd $USER )| cut -d : -f 6
Надає еквівалентну інформацію (якщо є).
Якщо користувача не існує, getent
повернеться помилка.
Ось невелика функція оболонки, яка не ігнорує вихідний код getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Ось приклад використання:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
Якщо ви зареєстровані як root, якщо ви знаєте USER
пароль або якщо у USER
вас немає пароля, наступний варіант - це ще один варіант:
su -c 'echo ~' ${USER}
За стандартної su
поведінки, якщо USER
вона не визначена або порожня, su
спробує запустити команду як корінь.
Якщо значення USER
не є допустимим ім'ям користувача, то буде піднято відповідна помилка: su: user <user> does not exist
.
Тут вже багато хороших відповідей, але це все одно може допомогти комусь.