it-swarm-eu.dev

Jak spustit program v čistém prostředí v bash?

Chci spustit program v prázdném prostředí (tj. Bez nastavení envariables). Jak to udělat v bash?

121
Eugene Yarmash

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ý.

135
ams

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.

41
Kusalananda

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.

4

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
1

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."
0
Coroos

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 .

0
starfry