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_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ą:
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.sh
drukuje /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
i SHLVL
są 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:."
bash
Można mieć „czyste” środowisko
$ env -i bash --noprofile --norc
env -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 przestaje bash
od czytania skryptów systemowych lub osobistych inicjalizacji powłoki, które w przeciwnym razie byłyby czytelne dla powłoki logowania.
--norc
Opcja przestaje bash
czytają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ś?
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ć:
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
env
nie obsługuje --
rozgraniczania i env -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.
env -i
czyści HOME
, co oznacza, że bash -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ą jako HOME
pierwszą.
Problem z większością odpowiedzi tutaj jest taki , że env -i
usuwa się HOME
, więc nawet jeśli biegniesz bash -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:
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
bash
powłoka logowania uruchomi się .bash_login
lub .bash_profile
. Aby uzyskać czyste środowisko, użyj --noprofile
lub ustaw HOME
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 :-):
% 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.