Wenn ein Skript in der aktuellen Shell ausgeführt werden soll, kann dies durch Hinzufügen eines Punkts vor dem Befehl erreicht werden:
. ./somescript.sh
Gibt es eine Möglichkeit, dies zu tun, ohne den Punkt jedes Mal einzugeben? Zum Beispiel ein Befehl, um vom Skript selbst zur übergeordneten Shell zu wechseln?
Ich glaube nicht, dass es das gibt (abgesehen vom Tippen
source somescript.sh
, aber das ist wahrscheinlich nicht das, wonach du suchst ^^).Wenn Sie das Skript wie gewohnt mit ausführen
./somescript.sh
, gibt die Shell diesen Befehl weiter und führt ihn aus. Es übergibt den Befehl an den Kernel und dann entscheidet der Kernel, wie dieser Befehl ausgeführt werden soll, indem es die#!
Zeile innerhalb des Skripts analysiert . Der Kernel startet dann den angegebenen Interpreter (in diesem Fall wahrscheinlich einebash
Subshell). Daher werden Änderungensomescript.sh
an der Umgebung in der Subshell isoliert, ohne dass dies Auswirkungen auf die übergeordnete Shell hat.Wenn die Shell das Skript selbst lesen soll, ohne einen anderen Prozess zu starten, müssen Sie dies explizit mit dem Schlüsselwort
.
oder mitteilensource
.quelle
alias
Befehl keine Subshell erstellen soll , wie es Scott vorgeschlagen hat.Wenn Sie es
./somescript.sh
als externes Programm ausführen , kann es im laufenden Shell-Prozess nichts tun, z. B. auf nicht exportierte Variablen zugreifen, Variablen setzen, das aktuelle Verzeichnis ändern usw. Daran führt kein Weg vorbei.(Nun, okay, Sie können möglicherweise einen Debugger über den Unterprozess ausführen und den Speicher des übergeordneten Prozesses optimieren. Wenn Sie es jedoch versuchen, stürzt die übergeordnete Shell wahrscheinlich ab.)
Du musst rennen
. ./somescript.sh
. Sie können das hinter einem Alias oder einer Funktion verbergen, wenn Sie möchten, aber auch hier muss die Definition des Alias oder der Funktion in der übergeordneten Shell erfolgen.quelle
Ich denke, das Skript, das Sie ausführen möchten, ist nicht ausführbar.
chmod a+x somescript.sh
Fügt das Ausführungsbit für Benutzer, Gruppe und andere (ugo) zu dieser Datei hinzu. Die erste Zeile der Datei benötigt ebenfalls das #! Linie oben, wie#!/bin/bash
.ls -l somescript.sh
zeigt Ihnen die RWX-Triplets (Lesen / Schreiben / Ausführen) für die Datei. Es wird ein x in mindestens dem ersten Satz benötigen, vorausgesetzt, Sie besitzen die Datei.quelle
export PATH=$PATH:/usr/local/bin
/ usr / local / bin zu Ihrem $ PATH hinzufügen, müssen Sie die Datei als Quelle angeben, um die ausgeführten Umgebungsvariablen zu ändern. Diese Frage lautet wirklich "Wie ändere ich programmgesteuert meine Umgebungsvariablen in meiner laufenden Shell von einem Bash-Skript aus?" Das Skript. ./somescript.sh
wird einwandfrei ausgeführt - Sie verwenden den Punkt-Befehl, um eine Datei zu erstellen. tcsh verwendet "source" für dasselbe.Durch Ausführen dieses Befehls in der Shell oder durch Hinzufügen zu Ihrer Shell-Konfigurationsdatei wird das aktuelle Verzeichnis an die Variable PATH angehängt. Die Variable PATH ist eine Liste von Verzeichnissen, in denen Ihre Shell nach Binärdateien sucht, die ausgeführt werden sollen, wenn Sie einen Befehl absetzen.
Auf diese Weise können Sie alle ausführbaren Dateien im aktuellen Verzeichnis ohne ausführen
./
quelle
.
nicht./
Teil des Dateinamens ist. Das Ausführen von ./somescript führt es in der aktuellen Shell nicht so aus wie dies der. ./somescript
Fall ist.