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,
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:
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.
echo ~$username
jest w porządku, ale w sh eval jest potrzebny, jeśli jest zmiennąeval echo "~$USER"
przyjmujesz założenie, że$USER
nie zawiera znaków specjalnych, które powłoka może interpretować. Na przykład jeśliUSER="foo\$bar"
, to kiedy my,eval
powłoka zastąpi$bar
twój wynik, co nie jest tym, czego chcesz. Zasadniczo, jeśli wybierzesz tę trasę, musisz upewnić się, że$USER
jest to rozsądny wkład. Prawdopodobnie tak będzie przez większość czasu, ale należy o tym pamiętać.To może Ci pomóc:
Będzie to również działać na użytkownikach, którzy nie są tobą. Na przykład,
źródło
getenv
zamiast zakładać, że lokalizacjapasswd
jest o krok dalej niż zakładać, że lokalizacja domu to/home/
Wygląda na to, że jesteś tym użytkownikiem - dlaczego nie
?
źródło
Nie wiem, czy to pomaga, ale umieszczenie tyldy poza wyrażeniem działa na ZSH, ale nie na Bash:
źródło
Po zalogowaniu uruchom,
cd
aby przejść do katalogu domowego, a następnie uruchom,pwd
aby wydrukować katalog roboczy.źródło
echo $HOME
.