Obecnie pracuję w szkole nad domową skorupą, dlatego jestem dzisiaj trochę ciekawy, w jaki sposób ustawiane są warniki muszli. Tak, to może być naprawdę ekscytujące!
W każdym razie oczywiście musimy poradzić sobie z przypadkiem, gdy nasza powłoka zostanie uruchomiona z pustym środowiskiem, tj. Poleceniem „env -i”. Dzięki env -i zmienna zewnętrzna environment jest absolutnie pusta, więc musimy zbudować podstawową ścieżkę, ścieżkę PWD i wszystko.
Naszym referencją jest csh, ponieważ jest to łatwe i proste. Po uruchomieniu csh z env -i, a następnie wydrukowaniu jego zmiennych, oto co możesz zobaczyć:
$ env -i csh
% set
addsuffix
argv ()
csubstnonl
cwd /Users/noesierra-velasquez
dirstack /Users/noesierra-velasquez
echo_style bsd
edit
gid 20
group staff
history 100
killring 30
owd
path (/usr/bin /bin)
prompt %
prompt2 %R?
prompt3 CORRECT>%R (y|n|e|a)?
shell /bin/tcsh
shlvl 1
status 0
tcsh 6.17.00
tty ttys001
uid 501
user noesierra-velasquez
version tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-apple-darwin) options wide,nls,dl,al,kan,sm,rh,color,filec
% env
HOSTTYPE=intel-mac
VENDOR=apple
OSTYPE=darwin
MACHTYPE=x86_64
SHLVL=1
PWD=/Users/noesierra-velasquez
LOGNAME=noesierra-velasquez
USER=noesierra-velasquez
GROUP=staff
HOST=MacBook-Pro-de-Noe-Sierra-Velasquez.local
REMOTEHOST=
Ok, więc jak widać, nie ma zestawu HOME i wydaje mi się to absolutnie normalne. Jeśli wtedy wpiszesz cd
, dostaniesz cd: No home directory.
. Żyjemy w normalnym świecie.
Ale oto magia. Wpisz wewnątrz pustego pliku csh env -i zsh
. zsh się załaduje. Teraz wydrukuj wszystkie zmienne env. (Uwaga: działa idealnie, jeśli piszesz bezpośrednio env -i zsh
, nawet z poziomu zsh, robię to tutaj tylko po to, aby mieć całkowitą pewność, że nie ma podstępnej sztuczki z zsh wywoływania siebie czy cokolwiek innego)
% env -i zsh
$ env
HOME=/Users/noesierra-velasquez
LOGNAME=noesierra-velasquez
SHLVL=1
PWD=/Users/noesierra-velasquez
OLDPWD=/Users/noesierra-velasquez
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
_=/usr/bin/env
Łał ! Co się stało !? zsh wydaje się (i miał) sposób na odzyskanie $ HOME i $ OLDPWD z tego, co wydaje mi się czystą nicością. (przy okazji, jeśli ktoś nie wie, jestem prawie pewien, że używa paths.h, aby odzyskać swoją ścieżkę).
Oczywiście wiem, że „czysta nicość” nie jest realną możliwością, więc pytam was: Czy wiesz, jak Zsh wraca do HOME i OLDPWD?
Dziękujemy za cierpliwość i życzę miłego dnia! :)
/Users/noesierra-velasquez
trakcie wykonywania tego testu? Prawdopodobnie robi tylkopwd
(lub równoważny) i zapełnia $ PWD i $ OLDPWD z bieżącego katalogu. Jeśli chodzi o $ HOME, może to wyglądać w górę (podobnie jak csh robi, gdy się odwołujesz~scott
).zsh
faktycznie robi to powłoka, możesz spojrzeć na kod źródłowy zsh.sourceforge.net/Arc/source.html .. na początku może trochę, ale zawsze świetnie jest mieć referencje podczas uczenia się czegoś ekscytujące :)Odpowiedzi:
Dokumentacja mówi o
$HOME
zmiennej:Przeczytałem go na odwrót, gdy
zsh
jest wywoływany sam, zbiera informacje o homedir z zarządzania użytkownikami systemu. Ten (niekompletny) fragment (zSrc/init.c
) służy jako dowód:Zatem bez emulacji (tzn. Emuluj zsh), homedir jest określany przez
getpwuid
wywołanie systemowe. Tylko w innym przypadku$HOME
używane jest środowisko .Nie mogę odtworzyć twojej „magii” za pomocą
$PWD
i$OLDPWD
. Ale może powinieneś rozważyć wywołanie zsh aszsh -f
, aby żaden użytkownik- (zsh nie zna twojego homedir!) I ustawienia systemowe nie otrzymały źródła. Za pomocą tego polecenia otrzymuję następujące środowisko w oknie debian:Więc nie ma zaskakujących wartości
$PWD
i$OLDPWD
. Kod źródłowy ustawia te parametry bezpośrednio do powyższego kodu:Dlatego jeśli
$HOME
nie jest ustawiony z otoczenia,zgetcwd
używana jest funkcja . Nie wyśledziłem tego, ale założę się, że zwraca bieżący reż;)
. Wreszcie$OLDPWD
zostaje zainicjowany z tą samą wartością.Wszystkie przykłady i fragmenty kodu pochodzą z zsh 5.0.5-dev-0
źródło
Dziękuję mpy za tę cenną informację. Pomogło mi to zrozumieć, jak wszystko działa.
Jednak stworzyłem proste rozwiązanie, aby odzyskać $ HOME, nawet gdy env ma wartość nul (ponieważ było to częścią mojego zadania). Poniższy program działa jak urok i użyj flagi NON-POSIX funkcji glob (3) (więc uważnie sprawdź, czy istnieje w twoim
glob.h
).Należy pamiętać, że oryginalnie nie
glob(3)
jest przeznaczony do tego celu.źródło