Próbuję zawrzeć zakres zmiennej w powłoce i nie chcę, aby dzieci widziały go w Zsh. Na przykład wpisuję to w .zshrc:
GREP_OPTIONS=--color=always
Ale jeśli uruchomię skrypt powłoki z następującymi elementami:
#!/bin/bash
echo $GREP_OPTIONS
Dane wyjściowe to:
--color=always
podczas gdy chcę, aby była zerowa (powyższy skrypt powłoki nie powinien w ogóle widzieć zmiennej GREP_OPTIONS).
W bashu można powiedzieć:, export -n GREP_OPTIONS=--color=always
co temu zapobiec. Jak to zrobić w Zsh?
shell-script
zsh
environment-variables
PonyEars
źródło
źródło
export -n
po prostu nie eksportuje eksportowanej zmiennej.Odpowiedzi:
export
w zsh jest skrótemtypeset -gx
, gdzie atrybutg
oznacza „globalny” (w przeciwieństwie do lokalnego dla funkcji), a atrybutx
oznacza „wyeksportowany” (tj. w środowisku). A zatem:Działa to również w ksh i bash.
Jeśli nigdy nie eksportujesz
GREP_OPTIONS
, nie musisz go cofać.Możesz także użyć pośredniego, przenośnego sposobu: rozbrojenie zmiennej nie powoduje jej wyeksportowania. W ksh / bash / zsh to nie działa, jeśli zmienna jest tylko do odczytu.
źródło
env -u GREP_OPTIONS your-script
niektóreenv
implementacje (dowolna powłoka). Lub(unset GREP_OPTIONS; exec your-script)
export_all
(-a
)? Ale nawet wtedytypeset +x GREP_OPTIONS
wyeksportuje zmienną. Jeśli nie możesz znaleźć, co jest nie tak, spróbuj wyszukać binarnie: zrób kopię zapasową.zshrc
, usuń drugą połowę, sprawdź, czy problem nadal występuje, następnie dołącz trzeci kwartał lub zmniejsz go do pierwszego kwartału i powtórz.Możesz użyć funkcji anonimowej, aby zapewnić zakres dla zmiennej. Od
man zshall
:Ale poza tym - jeśli nie używasz
export
w swojej.zshrc
w ogóle, zmienna powinny być widoczne tylko w bieżącej sesji interaktywnej, i nie powinny być eksportowane do podpowłok.Jak wyjaśnił terdon w swoim komentarzu:
export -n
pobash
prostu powoduje, że właściwość „export” jest usuwana ze zmiennej, więc użycieexport -n GREP_OPTIONS=--color=always
jest równoznaczne z całkowitym niestosowaniem eksportu -GREP_OPTIONS=--color=always
.Innymi słowy, aby uzyskać pożądane zachowanie, po prostu nie używaj
export
. Zamiast tego.zshrc
powinieneś miećDzięki temu zmienna będzie dostępna dla wszystkich uruchomionych powłok (interaktywnych, niezalogowanych), dokładnie tak, jak chcesz, ale nie zostanie wyeksportowana do powłok potomnych.
źródło