Das funktioniert - es ist nicht das, was ich verwenden würde, aber es "funktioniert". Lassen Sie uns ein Skript erstellen teredo
zum Setzen der Umgebungsvariablen TEREDO_WORMS
:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL -i
Sie wird von der Korn-Shell interpretiert, exportiert die Umgebungsvariable und ersetzt sich dann selbst durch eine neue interaktive Shell.
Bevor wir dieses Skript ausführen, müssen wir SHELL
in der Umgebung der C-Shell gesetzt, und die Umgebungsvariable TEREDO_WORMS
nicht gesetzt ist:
% env | grep SHELL
SHELL=/bin/csh
% env | grep TEREDO
%
Wenn das Skript ausgeführt wird, befinden Sie sich in einer neuen Shell, einer anderen interaktiven C-Shell, aber die Umgebungsvariable ist gesetzt:
% teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
Wenn Sie diese Shell verlassen, wird die ursprüngliche Shell übernommen:
% exit
% env | grep TEREDO
%
Die Umgebungsvariable ist in der ursprünglichen Shell-Umgebung nicht gesetzt. Wenn Sie exec teredo
um den Befehl auszuführen, dann wird die ursprüngliche interaktive Shell durch die Korn-Shell ersetzt, die die Umgebung festlegt, und diese wiederum wird durch eine neue interaktive C-Shell ersetzt:
% exec teredo
% env | grep TEREDO
TEREDO_WORMS=ukelele
%
Wenn Sie eingeben exit
(oder Control-D ), dann wird Ihre Shell beendet, wobei Sie wahrscheinlich aus diesem Fenster ausgeloggt werden, oder Sie kehren zur vorherigen Ebene der Shell zurück, von der aus die Experimente gestartet wurden.
Der gleiche Mechanismus funktioniert für die Bash oder die Korn-Shell. Es kann vorkommen, dass die Eingabeaufforderung nach den Exit-Befehlen an seltsamen Stellen erscheint.
Beachten Sie die Diskussion in den Kommentaren. Dies ist keine Lösung, die ich empfehlen würde, aber sie erfüllt den erklärten Zweck eines einzigen Skripts zum Einstellen der Umgebung, das mit allen Shells funktioniert (die das -i
Option, um eine interaktive Shell zu erstellen). Sie könnten auch Folgendes hinzufügen "$@"
nach der Option, andere Argumente weiterzugeben, wodurch die Shell als allgemeines Werkzeug zum Setzen der Umgebung und Ausführen von Befehlen verwendet werden kann. Vielleicht möchten Sie die Option -i
wenn es weitere Argumente gibt, die zu:
#!/bin/ksh
export TEREDO_WORMS=ukelele
exec $SHELL "${@-'-i'}"
Le site "${@-'-i'}"
Bit bedeutet: "Wenn die Argumentliste mindestens ein Argument enthält, ist die ursprüngliche Argumentliste zu verwenden; andernfalls ist sie durch -i
für die nicht vorhandenen Argumente".