In der Dokumentation zu wird angegeben exec
, dass die Shell im Fehlerfall beendet wird, wenn die aktuelle Shell nicht interaktiv ist und die execfail
Option nicht festgelegt ist.
Ich bemerkte ein seltsames Verhalten in einer interaktiven Bash-Shell, das ich mit den Dokumenten jedoch nicht erklären kann. Dieser Befehl
exec non-existent-file
erzeugt eine Fehlermeldung und die Shell bleibt wie erwartet aktiv. Wenn ich jedoch den gleichen Befehl in eine Datei und source
diese Datei stecke, wird die aktuelle Shell von der fehlgeschlagenen Ausführung beendet.
Könnte mir jemand helfen zu verstehen, warum dies passiert?
bash
?Antworten:
Wie ich fühle, ist es ein Fehler. Unten ist eine Art "Detektivgeschichte".
Ja, im
exec.def
Code sehen wir:so,
exec
würde bewirken , dass die Hülle a) für nicht-interaktiv Shell verlass mitfalse
„no_exit_on_failed_exec“ b) , wennexec
wird in Subshell läuftWenn der Befehl für die interaktive Shell vorhanden ist, wird die Shell durch den aufgerufenen Befehl ersetzt:
source
Befehl ruft keine Subshell auf - erzwingt die Ausführung aller Befehle in Ihrer aktuellen, aktiven Shell (wird z. B. zum Setzen von Variablen verwendet - nicht für eine Subshell, die beendet wird, sondern für Ihre aktuelle Shell). Nach dem Ausführen des Befehls sowohl mitsource
als auch direkt in der Shell wird Ihre Shell beendet (dies ist das erwartete Verhalten).Ich habe es kompiliert
bash-4.2
und imgdb
Debugger ausgeführt.Dies sind die letzten Befehle, die vor dem Beenden ausgeführt werden:
Variablen drucken:
Es stellt sich heraus, dass die Shell nicht interaktiv ist (
interactive=0
), während das eingebaute System beschafft wirdexec
. Dies ist der Grund für ein solches Verhalten. Es widerspricht dem dokumentierten Verhalten, man könnte also sagen, Sie haben einen Fehler gefunden.Die Änderung
non-interactive
,interactive=0
geschieht hier (evalfile.c
):wegen
flags=14
.flags
sind in der functionsource_file
(evalfile.c
) einen Level höher gesetzt :Und die Definitionen sind:
-> Flags 1110 = 14.
So, wie ich es verstehe, ist es ein Fehler:
source
führt Befehle in der aktuellen Shell aus, setzt aber das FlagFEVAL_NONINT 0x008
- nicht interaktiv (Fehler hier):,evalfile.c
insource_file
:Ich habe ein Problem in einem Bug-Tracker erstellt:
http://savannah.gnu.org/support/index.php?108980
Würde es sehen.
EDIT1: Als bash Supporter kommentierte das Ticket
Auch, wie er sagte, dürfte sich dieses Verhalten in naher Zukunft nicht ändern.
Die Frage scheint jetzt geschlossen.
quelle