Führen Sie das Skript in der aktuellen Shell ohne aus. vor dem Befehl

26

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?

Alu
quelle

Antworten:

22

Möglicherweise ist es nicht genau das, was Sie möchten, aber Sie können Folgendes tun:

alias somescript.sh='. ./somescript.sh'
Scott
quelle
2
Das hat mein Problem perfekt gelöst. Vielen Dank!
Alu
8

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 eine bashSubshell). Daher werden Änderungen somescript.shan 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 mitteilen source.

Martin von Wittich
quelle
Danke für die ausführliche Erklärung. :) Jetzt sehe ich, dass es im aufgerufenen Skript keine Möglichkeit gibt, dies zu tun, aber zufällig kann der übergeordneten Shell gesagt werden, dass sie mit dem aliasBefehl keine Subshell erstellen soll , wie es Scott vorgeschlagen hat.
Alu
1

Wenn Sie es ./somescript.shals 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.

Gilles 'SO - hör auf böse zu sein'
quelle
0

Ich denke, das Skript, das Sie ausführen möchten, ist nicht ausführbar. chmod a+x somescript.shFü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.shzeigt 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.

AR Diederich
quelle
Das Skript selbst funktioniert einwandfrei, aber ich möchte es in der aktuellen Shell ausführen, um Umgebungsvariablen der Shell ändern zu können.
Alu
Wenn das Exportieren der im Skript gewünschten Variablen nicht funktioniert, z. B. 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.shwird einwandfrei ausgeführt - Sie verwenden den Punkt-Befehl, um eine Datei zu erstellen. tcsh verwendet "source" für dasselbe.
AR Diederich
Das Ändern einer Variablen war nur ein Beispiel. Meine Frage ist, ob es möglich ist, der Shell zu sagen, dass es einen Punkt geben soll, ohne ihn tatsächlich zu schreiben (zum Beispiel aus dem Skript selbst)
Alu
Der Punkt kann leicht vergessen werden, was das Verhalten des Skripts vollständig ändern kann.
Alu
0
export PATH=$PATH:.

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 ./

GabeDain
quelle
1
Das OP fragt nach dem Ersten, das .nicht ./Teil des Dateinamens ist. Das Ausführen von ./somescript führt es in der aktuellen Shell nicht so aus wie dies der . ./somescriptFall ist.
Anthon