Ich möchte ein Programm in einer leeren Umgebung ausführen (dh ohne festgelegte Variablen). Wie mache ich das in bash?
bash
environment-variables
Eugene Yarmash
quelle
quelle
Antworten:
Sie können dies tun mit
env
: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:
dh wischen Sie die Umgebung und drucken Sie es dann. Die Ausgabe ist leer.
quelle
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
undSHLVL
wird automatisch von Bash gesetzt. +1.env -i bash --norc -c "declare -p PATH"
givesdeclare -- 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 werdenDer
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 dasbash
Lesen der systemweiten oder persönlichen Shell-Initialisierungsskripten, die ansonsten für eine Anmeldeshell gelesen würden.Die
--norc
Option stoppt dasbash
Lesen der persönlichen Shell-Initialisierungsskripten, die ansonsten für eine interaktive Shell gelesen würden.quelle
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:
Alternativ können Sie sich in einer kleinen Umgebung mit Anmeldezeit anmelden.
quelle
env
keine--
Abgrenzung und unternimmt keineenv -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.
quelle
env -i
ClearsHOME
,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 festlegenHOME
.Das Problem mit den meisten Antworten hier ist, dass es sich
env -i
klärtHOME
. Selbst wenn Siebash -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:Beispiel:
quelle
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 festHOME
, 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 :-):
quelle
/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.