Chci spustit program v prázdném prostředí (tj. Bez nastavení envariables). Jak to udělat v bash?
Můžete to provést pomocí env
:
env -i your_command
Na rozdíl od níže uvedených komentářů dělá zcela vymaže prostředí, ale nezabrání to your_command
nastavení nových proměnných. Zejména spuštění shellu způsobí /etc/profile
ke spuštění a Shell může mít také některá zabudovaná nastavení.
Můžete to zkontrolovat pomocí:
env -i env
tj. setřete prostředí a poté jej vytiskněte. Výstup bude prázdný.
Může se jednat o „čisté“ prostředí bash
$ env -i bash --noprofile --norc
Příkaz env -i
Provede příkaz, který je mu dán na příkazovém řádku, aniž by došlo k převodu exportovaných proměnných prostředí starého prostředí Shell do prostředí prováděného programu.
Možnost --noprofile
Zastaví bash
ve čtení systémových inicializačních skriptů systému Shell, které by jinak byly čteny pro přihlašovací prostředí.
Možnost --norc
Zastaví bash
ve čtení osobních skriptů inicializace prostředí Shell, které by jinak byly čteny pro interaktivní prostředí Shell.
env -i somecommand
spustí příkaz v prázdném prostředí, jak ams již bylo zmíněno .
Mnoho programů se spoléhá na některé důležité proměnné prostředí, takže je možná budete chtít zachovat:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Případně se můžete přihlásit do malého prostředí pro přihlášení.
ssh localhost somecommand
Přijatá odpověď je správná, ale obvykle byste chtěli:
env -i bash -l -c "printenv; and any other commands"
Tím získáte holé, ale funkční bash (stejné jako při přihlášení v neinteraktivním režimu). To například nastavuje jazyk, časové pásmo, HOME atd.
Problém s většinou odpovědí je, že env -i
vymaže HOME
, takže i když spustíte bash -l
uvnitř, nebude číst vaše .bash_profile
atd. Pokud hledáte Shell, který se chová, jako kdybyste právě provedli nové přihlášení, budete chtít místo toho:
env -i HOME="$HOME" bash -l -c 'your_command'
Příklad:
$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
Odpověď na Balkiho komentář (a zodpovězení vlastní otázky v tomto procesu :-):
% 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."
Pokud chcete zajistit, aby skript měl čisté prostředí, můžete změnit řádek Shebang, jak ukazuje tento malý příklad:
#!/usr/bin/env -S -i bash
env
který zobrazuje jeho prostředí jako je tato
PWD=/home/myuser/mydir
SHLVL=1
_=/usr/bin/env
Tady spustíme bash
Shell skrz env
, který trvá -i
argument, který jí dává pokyn k čištění prostředí. The -S
je povinné při předávání více argumentů na řádcích Shebang .