Отримайте домашній каталог за іменем користувача


84

Я хочу отримати домашній dir будь-якого користувача із луною

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: Що ви маєте на увазі під "попереднім"?
choroba

1
@choroba Додайте користувача, видаліть його, а потім додайте користувача з тим самим іменем користувача. Якщо домашня папка користувача вдруге відрізняється, ця команда надає оригінальну домашню папку, а не поточну. Відповідь Глена Джекмана дає поточну.
Андрій

Зауважте також, що якщо ви eval echo "~$USER"робите припущення, що $USERне містить спеціальних символів, оболонка може інтерпретувати. Наприклад, якщо USER="foo\$bar", тоді, коли ми evalоболонку будемо підставляти $barдо вашого результату, це не те, що ви хочете. В основному, якщо ви рухаєтесь цим маршрутом, вам потрібно переконатися, що $USERце введений спосіб. Більшість часу це, мабуть, буде, але ви повинні пам’ятати про це.
Зоравар

65

Це може допомогти вам:

homedir=$( getent passwd "$USER" | cut -d: -f6 )

Це також буде працювати над користувачами, які не ви. Наприклад,

homedir=$( getent passwd "someotheruser" | cut -d: -f6 )

Це законно, getenvзамість того, щоб вважати, що місце розташування - passwdце ще крок далі, ніж припускати, що місце проживання є/home/
Еван Керролл

13

Здається, ти саме такий користувач - чому ні

echo $HOME

?


3
Це не спрацює, якщо ви перебуваєте в середовищі sudo'ed і не передавали прапорці sudo -H або -i - $ HOME все ще буде попереднім домашнім каталогом (sudo'ing) користувача.
Асфанд Казі

1

Я не знаю, чи допомагає це, але розміщення тильди поза виразом працює на ZSH, але не на Bash:

echo ~`echo $USER`

0

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


Це не буде працювати; ідея полягає в тому, щоб зробити це в скрипті оболонки, і, мабуть, не вимагаючи повноважень відповідного користувача ...
SamB

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