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

Odpowiedzi:


86

Możesz użyć eval:

eval echo ~$USER

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


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 )

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

?


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`

0

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.