Daher muss ich verhindern, dass viele exportierte Variablen von einer untergeordneten Shell erkannt werden.
Das Problem besteht darin, dass eine Anwendung (Wine+UDK) keine Projekte mit zu vielen (>65535) Bytes in der Umgebung erstellt, und meine hat eine Menge (95323), nachdem ich ein Projekt (ScriptEchoColor) verwende, das Umgebungsvariablen zwischen allen Bash-Shells teilt.
Ich kann keinen Befehl finden, mit dem ich eine untergeordnete Shell erstellen kann, die die aktuellen Umgebungsvariablen nicht akzeptiert und stattdessen nur die Variablen verwendet, die in meinem Benutzerprofil und im gesamten System festgelegt sind.
Ich habe viele der unter gezeigten Optionen ausprobiert bash --help
.
Antwort1
Mit dem Befehl können Sie env
einen Prozess mit einer sauberen Umgebung starten. Hier ist ein Beispiel:
env -i /bin/myprog
Wenn Sie dennoch einige Variablen exportieren müssen, können Sie dies im Aufruf tun:
env -i MYVAR=foo /bin/myprog
Der Befehl env wird benötigt fürPOSIX.
Antwort2
env -i somecommand
wird in einer leeren Umgebung ausgeführt somecommand
. Sie können Argumente nach angeben somecommand
. Wenn PATH
gelöscht wird, müssen Sie den vollständigen Pfad zu angeben somecommand
. Alternativ können Sie PATH
einen anderen Wert beibehalten oder festlegen.
env -i PATH="$PATH:/another/directory" somecommand
Wenn Sie dieselbe Umgebung haben möchten, die Sie nach der Anmeldung hätten, behalten Sie nur einige Variablen bei und laden Sie Ihre , .profile
um den Rest festzulegen. Wenn Sie eine andere Anmelde-Shell verwenden (bash mit .bash_profile
, csh mit .login
usw.), passen Sie sie entsprechend an.
env -i HOME="$HOME" PATH=/usr/local/bin:/usr/bin:/bin USER="$USER" \
sh -c '. ~/.profile; "$@"' _ somecommand
Alternativ möchten Sie vielleicht auch einige Variablen aus der Umgebung entfernen. env -u VAR1 -u VAR2 somecommand
entfernt VAR1
und VAR2
aus der Umgebung und führt aus somecommand
. Unter Linux können Sie verwenden, env -0 | tr '\n\0' '.\n' | sed 's/=.*//'
um eine Liste der Umgebungsvariablen mit einem Namen pro Zeile zu erstellen, die zum Filtern geeignet ist. Auf anderen Unix-Varianten env | sed 's/=.*//'
erledigt es dieselbe Aufgabe, mit der Einschränkung, dass es möglicherweise falsche Ergebnisse findet, wenn die Werte einiger Variablen Zeilenumbrüche enthalten.
Antwort3
Problem typeset +x variable_name...
oder declare +x variable_name...
Befehl. Sie können sogar reguläre Ausdrücke für Variablennamen verwenden, wie typeset +x ${!MY_VAR_*}
.