Ich habe Beispiele für Wrapper-Skripte gesehen, die kurz und bündig wie folgt lauten:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
exec "$myprog" "$@"
Wie oben zu sehen, exec
ersetzen sie die neu erstellte Shell fast sofort durch die $myprog
. Man könnte dasselbe erreichen, ohne exec
:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
"$myprog" "$@"
In diesem letzten Beispiel wird eine neue Bash-Instanz gestartet und dann $myprog
als untergeordneter Prozess der Bash-Instanz gestartet.
Was sind die Vorteile des ersten Ansatzes?
exec
eingebaute Shell .Antworten:
Durch
exec
die Verwendung von wird der Wrapper transparenter, dh es ist weniger wahrscheinlich, dass der Benutzer oder die Anwendung, die das Skript aufruft, sich darüber im Klaren ist, dass es sich um ein Relay handelt, das wiederum das „echte“ Programm startet.Insbesondere, wenn der Aufrufer das Programm beenden möchte, wird der gerade gestartete Prozess abgebrochen. Wenn das Wrapper-Skript einen untergeordneten Prozess ausführt, muss der Aufrufer wissen, dass er das untergeordnete Element des Wrappers ermitteln und stattdessen beenden soll. Das Wrapper-Skript könnte einen Trap setzen, um einige Signale weiterzuleiten, aber das würde mit SIGSTOP oder SIGKILL nicht funktionieren, die nicht abgefangen werden können.
Das Aufrufen
exec
spart außerdem ein wenig Speicher (und andere Ressourcen wie PIDs usw.), da keine zusätzliche Shell vorhanden sein muss, die nichts mehr zu tun hat.Wenn mehrere Wrapper vorhanden sind, summieren sich die Probleme (Schwierigkeit, den richtigen Prozess zum Beenden zu finden, Speicheraufwand usw.).
Einige Shells (z. B. die Korn-Shell) erkennen automatisch, wann ein Befehl der letzte ist, und es gibt keine aktive Falle. Sie setzen ein implizites
exec
, aber nicht alle tun dies (z. B. kein Bash).quelle
Finding keine Duplikate ... beziehen sich auf die FreeBSD - Handbuch , das einen guten Grund genug gibt:
Das ist im Wesentlichen der Grund, der mir vor einiger Zeit (von einem der Träger) erklärt wurde und der ziemlich bekannt ist.
quelle