Chcę uruchomić program w pustym środowisku (tj. Bez ustawionych zmiennych). Jak to zrobić w bash?
Chcę uruchomić program w pustym środowisku (tj. Bez ustawionych zmiennych). Jak to zrobić w bash?
Odpowiedzi:
Możesz to zrobić za pomocą env:
env -i your_command
W przeciwieństwie do poniższych komentarzy, to całkowicie usuwa środowisko, ale nie przeszkadza w your_commandustawianiu nowych zmiennych. W szczególności uruchomienie powłoki spowoduje jej /etc/profileuruchomienie, a powłoka może mieć także pewne wbudowane ustawienia.
Możesz to sprawdzić za pomocą:
env -i env
tj. wytrzyj środowisko, a następnie wydrukuj je. Dane wyjściowe będą puste.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.shdrukuje /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin.
PATH, PWDi SHLVLsą ustawiane automatycznie przez bash. +1.
env -i bash --norc -c "declare -p PATH"daje declare -- 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:."
bashMożna mieć „czyste” środowisko
$ env -i bash --noprofile --norc
env -iPolecenie wykonuje polecenie nadane mu w wierszu poleceń bez przenoszenia dowolnego eksportowanych zmiennych środowiskowych starego środowisku powłoki do środowiska wykonywanego programu.
--noprofileOpcja przestaje bashod czytania skryptów systemowych lub osobistych inicjalizacji powłoki, które w przeciwnym razie byłyby czytelne dla powłoki logowania.
--norcOpcja przestaje bashczytając osobiste powłoki skrypty inicjujące, które w przeciwnym razie byłyby czytelne dla interaktywnej powłoki.
env -i? W jakim systemie jesteś?
envw celu oczyszczenia mojego środowiska oraz --noprofileuniknięcia pozyskiwania / etc / profilu i przyjaciół oraz --norcunikania pozyskiwania ~ / .bashrc i przyjaciół.
env -i somecommanduruchamia 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ć:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Alternatywnie możesz zalogować się do małego środowiska do logowania.
ssh localhost somecommand
envnie obsługuje --rozgraniczania i env -i FOO=bar -- envpodejmowania 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.
env -iczyści HOME, co oznacza, że bash -lnie można znaleźć Twojego .bash_profileitp. Jeśli chcesz powłoki podobnej do tej, którą otrzymujesz przy nowym logowaniu, potrzebujesz dodatkowej pośredniczości, aby ustawić ją jako HOMEpierwszą.
Problem z większością odpowiedzi tutaj jest taki , że env -iusuwa się HOME, więc nawet jeśli biegniesz bash -lw środku, nie przeczyta twojego .bash_profileitp. Jeśli szukasz powłoki, która działa tak, jakbyś właśnie zrobił nowe logowanie, zamiast tego chciałbym tego:
env -i HOME="$HOME" bash -l -c 'your_command'
Przykład:
$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
bashpowłoka logowania uruchomi się .bash_loginlub .bash_profile. Aby uzyskać czyste środowisko, użyj --noprofilelub ustaw HOMEkatalog, 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 :-):
% echo Environment in calling shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling shell: vars: 43
==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.
#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh
echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."
/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.