Shell-Skripte werden normalerweise so behandelt, als wären sie mit jeder anderen Art von ausführbarer Datei identisch, z. B. Binärdateien, Python-Skripten, Perl-Skripten oder anderen Skripten. Sie haben oben einen Shebang , der den Kernel anweist, sie durch die Shell auszuführen. Es wird erwartet, dass sie wie jeder andere Befehl aufgerufen werden.
Daher wird bei jedem Aufruf des Skripts eine neue Shell gestartet, und Einstellungen, wie set -f
sie in der aufrufenden Shell oder in einer anderen Shell-Instanz im System vorhanden sind, sind irrelevant.
Natürlich können Benutzer Ihr Skript als Quelle ausführen, anstatt es auszuführen, zum Beispiel wie folgt:
. /path/to/your/script
oder um es in einer Shell auszuführen, die nicht standardmäßige Einstellungen wie diese hat:
sh -f /path/to/your/script
Dies wird jedoch nicht als normale Methode oder als Aufruf Ihres Skripts angesehen, und Benutzer, die dies tun, sollten erwarten, was auch immer sie als Ergebnis erhalten.
Beachten Sie, dass es einige Skripte gibt, die beschafft und nicht ausgeführt werden sollen, da sie beispielsweise dazu dienen, das cwd zu ändern oder Umgebungsvariablen festzulegen, die in der Umgebung der Sourcing-Shell berücksichtigt werden müssen. Diese Skripte sind jedoch in der Minderheit und es wird normalerweise als Teil eines vereinbarten Protokolls durchgeführt. Diese Dateien können eher als "Plugins" für jedes System betrachtet werden, von dem sie erwartet werden, und nicht als unabhängige Skripte. Beispielsweise werden Dateien /etc/rc*.d
mit Namen, die auf enden, .sh
vom Startskript-Subsystem bezogen und nicht ausgeführt. Es wird dokumentiert, dass dies der Fall ist, wenn Sie eine Datei mit einem solchen Namen in platzieren/etc/rc*.d
und wenn es fertig ist, ist es absichtlich gemacht. Die Konvention, Dateien zu benennen, die beschafft und nicht auf diese Weise ausgeführt werden sollen, wird auch an anderer Stelle befolgt, jedoch nicht allgemein.
Es ist richtig, dass Dateien, die auf diese Weise bezogen werden sollen, darauf achten müssen, welche Einstellungen in der Umgebung ihres Anrufers vorhanden sein können, die sich auf das Verhalten der Shell auswirken können. Dann sollte das vereinbarte Protokoll jedoch idealerweise eine vorhersehbare Ausführungsumgebung versprechen.
shell_state=$(set +o)
... Skript ...eval "$shell_state"