So führen Sie etwas in der aktuellen Shell aus

So führen Sie etwas in der aktuellen Shell aus

Ich möchte ein Bash-Skript oder etwas ähnliches erstellen, das ich in der aktuellen Shell ausführen kann:

 echo '#!/bin/bash 
  export foo="bar" ' > zoom.sh

aber wenn ich dieses Skript im aktuellen Prozess ausführen möchte:

exec ./zoom.sh

dann wird mein Terminal einfach mit „Prozess abgeschlossen“ beendet, selbst wenn ich verwende set +e, wird es trotzdem beendet.

Es gibt sourceund , evaldas Dinge in der aktuellen Shell ausführt, also ist eval vielleicht meine beste Wahl? Eine Bash-Funktion wird funktionieren – aber ich muss mich sourcein erster Linie darauf verlassen, dass der Benutzer sie verwendet.

Antwort1

Aus dem Handbuch geht hervor, dass exec keinen neuen Prozess erstellt, sondern nur die aktuelle Shell ersetzt, sodass es nach der Ausführung auch die Sitzung beendet.

exec [-cl] [-a name] [command [arguments]]:
Wenn command angegeben ist, ersetzt es die Shell. Es wird kein neuer Prozess erstellt. Die Argumente werden zu den Argumenten für command. Wenn die Option -l angegeben ist, setzt die Shell einen Bindestrich an den Anfang des nullten Arguments, das an command übergeben wird. Dies macht login(1). Die -cOption bewirkt, dass command mit einer leeren Umgebung ausgeführt wird. Wenn -aangegeben ist, übergibt die Shell name als nulltes Argument an den ausgeführten command. Wenn command aus irgendeinem Grund nicht ausgeführt werden kann, wird eine nicht interaktive Shell beendet, es sei denn, die Shell-Option execfailist aktiviert. In diesem Fall gibt sie einen Fehler zurück. Eine interaktive Shell gibt einen Fehler zurück, wenn die Datei nicht ausgeführt werden kann. Wenn command nicht angegeben ist, werden alle Umleitungen in der aktuellen Shell wirksam und der Rückgabestatus ist 0. Wenn ein Umleitungsfehler auftritt, ist der Rückgabestatus 1.

$ cat zoom.sh
#!/bin/bash
export foo="bar"
echo $?
$ exec ./zoom.sh
0
Connection to localhost closed

verwandte Informationen