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?

Antworten:


22

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

alias somescript.sh='. ./somescript.sh'

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.


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.


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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.