Uzyskaj katalog domowy według nazwy użytkownika

84

Chcę uzyskać katalog domowy dowolnego użytkownika za pomocą echa

echo ~puchuu
>> /home/puchuu

Ale nie mogę używać zmiennej

echo ~$USER
>> ~puchuu
echo `echo ~$USER`
>> ~puchuu
puchu
źródło

Odpowiedzi:

86

Możesz użyć eval:

eval echo ~$USER

Ale zobacz komentarz Andrew i odpowiedź Glenna poniżej.

choroba
źródło
8
W bash eval nie jest potrzebny, ale echo ~$usernamejest w porządku, ale w sh eval jest potrzebny, jeśli jest zmienną
Felipe Alcacibar
Czasami daje to niewłaściwą wartość, może folder domowy poprzedniego konta o tej samej nazwie użytkownika?
Andrew,
@AndrewMacFie: Co rozumiesz przez „poprzednie”?
choroba
1
@choroba Dodaj użytkownika, usuń użytkownika, a następnie dodaj użytkownika o tej samej nazwie użytkownika. Jeśli folder domowy użytkownika jest inny za drugim razem, to polecenie podaje oryginalny folder domowy zamiast bieżącego. Odpowiedź Glenna Jackmana daje obecną.
Andrew,
Zauważ też, że jeśli eval echo "~$USER"przyjmujesz założenie, że $USERnie zawiera znaków specjalnych, które powłoka może interpretować. Na przykład jeśli USER="foo\$bar", to kiedy my, evalpowłoka zastąpi $bartwój wynik, co nie jest tym, czego chcesz. Zasadniczo, jeśli wybierzesz tę trasę, musisz upewnić się, że $USERjest to rozsądny wkład. Prawdopodobnie tak będzie przez większość czasu, ale należy o tym pamiętać.
Zorawar
65

To może Ci pomóc:

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

Będzie to również działać na użytkownikach, którzy nie są tobą. Na przykład,

homedir=$( getent passwd "someotheruser" | cut -d: -f6 )
Glenn Jackman
źródło
Jest to uzasadnione, getenvzamiast zakładać, że lokalizacja passwdjest o krok dalej niż zakładać, że lokalizacja domu to/home/
Evan Carroll
13

Wygląda na to, że jesteś tym użytkownikiem - dlaczego nie

echo $HOME

?

Greenoldman
źródło
3
To nie zadziała, jeśli jesteś w środowisku sudo i nie przekazałeś sudo flag -H lub -i - $ HOME nadal będzie katalogiem domowym poprzedniego (sudo'ing) użytkownika.
Asfand Qazi
1

Nie wiem, czy to pomaga, ale umieszczenie tyldy poza wyrażeniem działa na ZSH, ale nie na Bash:

echo ~`echo $USER`
Pedro Penna
źródło
0

Po zalogowaniu uruchom, cdaby przejść do katalogu domowego, a następnie uruchom, pwdaby wydrukować katalog roboczy.

Vinoth Hari
źródło
To nie zadziała; chodzi tutaj o to, aby zrobić to w skrypcie powłoki i prawdopodobnie bez wymagania poświadczeń użytkownika, o którym mowa ...
SamB
-1 z tego samego powodu, o którym wspomniał SamB. Zredagowałem twoją odpowiedź, ponieważ chcę, abyś zobaczył, jak korzystać z formatowania Markdown i był bardziej zwięzły. Przegapiłeś także znacznie łatwiejszą metodę, która jest po prostu echo $HOME.
wjandrea