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.