Ich möchte ein Programm in einer leeren Umgebung ausführen (dh ohne festgelegte Variablen). Wie mache ich das in bash?
Ich möchte ein Programm in einer leeren Umgebung ausführen (dh ohne festgelegte Variablen). Wie mache ich das in bash?
Antworten:
Sie können dies tun mit env
:
env -i your_command
Im Gegensatz zu den Kommentaren unten, dies tut vollständig aus der Umwelt klar, aber es verhindert nicht , your_command
neue Variablen zu setzen. Insbesondere das Ausführen einer Shell führt dazu, dass die /etc/profile
ausgeführt wird, und die Shell verfügt möglicherweise auch über einige integrierte Einstellungen.
Sie können dies überprüfen mit:
env -i env
dh wischen Sie die Umgebung und drucken Sie es dann. Die Ausgabe ist leer.
echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh
druckt /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.
PATH
, PWD
und SHLVL
wird automatisch von Bash gesetzt. +1.
env -i bash --norc -c "declare -p PATH"
gives declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
. Beachten Sie das "-x" für exportiert (und daher Teil der Umgebung), wenn Sie es selbst exportieren: env -i bash --norc -c "export PATH; declare -p PATH"
gibtdeclare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Eine "saubere" bash
Umgebung kann mit gehabt werden
$ env -i bash --noprofile --norc
Der env -i
Befehl führt den ihm über die Befehlszeile erteilten Befehl aus, ohne eine der exportierten Umgebungsvariablen der alten Shell-Umgebung in die Umgebung des ausgeführten Programms zu übertragen.
Die --noprofile
Option stoppt das bash
Lesen der systemweiten oder persönlichen Shell-Initialisierungsskripten, die ansonsten für eine Anmeldeshell gelesen würden.
Die --norc
Option stoppt das bash
Lesen der persönlichen Shell-Initialisierungsskripten, die ansonsten für eine interaktive Shell gelesen würden.
env -i
? Auf welchem System bist du?
env
meine Umgebung zu säubern und --noprofile
zu vermeiden, / etc / profile und Freunde --norc
zu beschaffen und zu vermeiden, ~ / .bashrc und Freunde zu beschaffen.
env -i somecommand
führt einen Befehl in einer leeren Umgebung aus, wie ams bereits erwähnt hat .
Viele Programme sind auf einige wichtige Umgebungsvariablen angewiesen, daher möchten Sie diese möglicherweise beibehalten:
env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand
Alternativ können Sie sich in einer kleinen Umgebung mit Anmeldezeit anmelden.
ssh localhost somecommand
env
keine --
Abgrenzung und unternimmt keine env -i FOO=bar -- env
Versuche, einen Befehl mit dem Namen auszuführen --
.
env -i -- FOO=bar env
eigentlich sein. Mein Fehler. Nicht, dass das --
nützlich wäre, denn das Folgende beginnt nicht mit -
.
Während die akzeptierte Antwort korrekt ist, möchten Sie normalerweise Folgendes tun:
env -i bash -l -c "printenv; and any other commands"
Dadurch erhalten Sie eine nackte, aber funktionierende Bash (genau wie bei der Anmeldung im nicht interaktiven Modus). Dies stellt zum Beispiel die Sprache, Zeitzone, HOME usw. ein.
env -i
Clears HOME
, bash -l
dh Ihr .bash_profile
usw. nicht finden können . Wenn Sie eine Shell möchten, die derjenigen entspricht, die Sie bei einem neuen Login erhalten würden, müssen Sie zuerst eine zusätzliche Indirektion festlegen HOME
.
Das Problem mit den meisten Antworten hier ist, dass es sich env -i
klärt HOME
. Selbst wenn Sie bash -l
von innen laufen , wird es Ihr .bash_profile
usw. nicht lesen . Wenn Sie nach einer Shell suchen, die sich so verhält, als hätten Sie sich gerade neu angemeldet, sind Sie würde dies stattdessen wollen:
env -i HOME="$HOME" bash -l -c 'your_command'
Beispiel:
$ 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
Shell ausgeführt wird .bash_login
oder .bash_profile
. Verwenden Sie ein Verzeichnis, das diese Dateien nicht enthält --noprofile
, oder legen Sie es fest HOME
, um eine saubere Umgebung zu erhalten . Ich nehme an, es hängt davon ab, was Sie mit "sauber" meinen.
env -i bash -c ...
. Diese Antwort ist speziell, wenn Sie eine Shell möchten, die aussieht, als hätten Sie sich gerade neu auf dem Computer angemeldet.
Um den Kommentar von balki zu beantworten (und dabei meine eigene Frage zu beantworten :-):
% 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
/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.