Chcę uruchomić program w pustym środowisku (tj. Bez ustawionych zmiennych). Jak to zrobić w bash?
bash
environment-variables
Eugene Yarmash
źródło
źródło
Odpowiedzi:
Możesz to zrobić za pomocą
env
:W przeciwieństwie do poniższych komentarzy, to całkowicie usuwa środowisko, ale nie przeszkadza w
your_command
ustawianiu nowych zmiennych. W szczególności uruchomienie powłoki spowoduje jej/etc/profile
uruchomienie, a powłoka może mieć także pewne wbudowane ustawienia.Możesz to sprawdzić za pomocą:
tj. wytrzyj środowisko, a następnie wydrukuj je. Dane wyjściowe będą puste.
źródło
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
drukuje/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.PATH
,PWD
iSHLVL
są ustawiane automatycznie przez bash. +1.env -i bash --norc -c "declare -p PATH"
dajedeclare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Zwróć uwagę na „-x” dla wyeksportowanego (a zatem i części środowiska), jeśli wyeksportujesz go sam:env -i bash --norc -c "export PATH; declare -p PATH"
dajedeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
bash
Można mieć „czyste” środowiskoenv -i
Polecenie wykonuje polecenie nadane mu w wierszu poleceń bez przenoszenia dowolnego eksportowanych zmiennych środowiskowych starego środowisku powłoki do środowiska wykonywanego programu.--noprofile
Opcja przestajebash
od czytania skryptów systemowych lub osobistych inicjalizacji powłoki, które w przeciwnym razie byłyby czytelne dla powłoki logowania.--norc
Opcja przestajebash
czytając osobiste powłoki skrypty inicjujące, które w przeciwnym razie byłyby czytelne dla interaktywnej powłoki.źródło
env -i
? W jakim systemie jesteś?env
w celu oczyszczenia mojego środowiska oraz--noprofile
uniknięcia pozyskiwania / etc / profilu i przyjaciół oraz--norc
unikania pozyskiwania ~ / .bashrc i przyjaciół.env -i somecommand
uruchamia polecenie w pustym środowisku, jak już wspomniał ams .Wiele programów opiera się na niektórych ważnych zmiennych środowiskowych, więc warto je zachować:
Alternatywnie możesz zalogować się do małego środowiska do logowania.
źródło
env
nie obsługuje--
rozgraniczania ienv -i FOO=bar -- env
podejmowania prób uruchomienia polecenia o nazwie--
.env -i -- FOO=bar env
. Mój błąd. Nie--
jest to przydatne, ponieważ to, co następuje, nie zaczyna się od-
.Chociaż zaakceptowana odpowiedź jest prawidłowa, zwykle chcesz:
env -i bash -l -c "printenv; and any other commands"
To daje ci nagą, ale funkcjonalną bash (taką samą, jak przy logowaniu w trybie nieinteraktywnym). To na przykład ustawia język, strefę czasową, HOME itp.
źródło
env -i
czyściHOME
, co oznacza, żebash -l
nie można znaleźć Twojego.bash_profile
itp. Jeśli chcesz powłoki podobnej do tej, którą otrzymujesz przy nowym logowaniu, potrzebujesz dodatkowej pośredniczości, aby ustawić ją jakoHOME
pierwszą.Problem z większością odpowiedzi tutaj jest taki , że
env -i
usuwa sięHOME
, więc nawet jeśli biegnieszbash -l
w środku, nie przeczyta twojego.bash_profile
itp. Jeśli szukasz powłoki, która działa tak, jakbyś właśnie zrobił nowe logowanie, zamiast tego chciałbym tego:Przykład:
źródło
bash
powłoka logowania uruchomi się.bash_login
lub.bash_profile
. Aby uzyskać czyste środowisko, użyj--noprofile
lub ustawHOME
katalog, w którym nie ma tych plików. Przypuszczam, że zależy to od tego, co rozumiesz przez „czysty”.env -i bash -c ...
. Ta odpowiedź jest szczególnie gdy potrzebujesz powłoki, która wygląda tak, jakbyś właśnie zrobił nowe logowanie na maszynie.Aby odpowiedzieć na komentarz Balki (i odpowiedzieć na moje własne pytanie w tym procesie :-):
źródło
/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
--ignore-environment
, otrzymam to:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.