Shell-Skript-Lader ist meine Lösung für dieses Problem.
Es stellt eine Funktion namens include() zur Verfügung, die in vielen Skripten mehrfach aufgerufen werden kann, um ein einzelnes Skript zu referenzieren, das Skript aber nur einmal lädt. Die Funktion kann vollständige Pfade oder Teilpfade akzeptieren (das Skript wird in einem Suchpfad gesucht). Eine ähnliche Funktion namens load() wird ebenfalls bereitgestellt, die die Skripte bedingungslos lädt.
Es funktioniert für bash , ksh , pd ksh y zsh mit optimierte Skripte für jede von ihnen; und andere Shells, die allgemein mit dem ursprünglichen sh kompatibel sind, wie Asche , Bindestrich , Erbstück sh usw. durch ein universelles Skript, das seine Funktionen automatisch in Abhängigkeit von den Funktionen optimiert, die die Shell bieten kann.
[Beispiel gefällig]
start.sh
Dies ist ein optionales Startskript. Die Startmethoden werden hier nur aus Bequemlichkeit platziert und können stattdessen in das Hauptskript eingefügt werden. Dieses Skript wird auch nicht benötigt, wenn die Skripte kompiliert werden sollen.
#!/bin/sh
# load loader.sh
. loader.sh
# include directories to search path
loader_addpath /usr/lib/sh deps source
# load main script
load main.sh
main.sh
include a.sh
include b.sh
echo '---- main.sh ----'
# remove loader from shellspace since
# we no longer need it
loader_finish
# main procedures go from here
# ...
a.sh
include main.sh
include a.sh
include b.sh
echo '---- a.sh ----'
b.sh
include main.sh
include a.sh
include b.sh
echo '---- b.sh ----'
Ausgabe:
---- b.sh ----
---- a.sh ----
---- main.sh ----
Das Beste ist, dass darauf basierende Skripte auch mit dem verfügbaren Compiler zu einem einzigen Skript kompiliert werden können.
Hier ist ein Projekt, das es verwendet: http://sourceforge.net/p/playshell/code/ci/master/tree/ . Es kann portabel mit oder ohne Kompilierung der Skripte ausgeführt werden. Das Kompilieren, um ein einzelnes Skript zu erzeugen, kann ebenfalls erfolgen und ist bei der Installation hilfreich.
Ich habe auch einen einfacheren Prototyp für alle konservativen Parteien erstellt, die eine kurze Vorstellung davon haben möchten, wie ein Implementierungsskript funktioniert: https://sourceforge.net/p/loader/code/ci/base/tree/loader-include-prototype.bash . Es ist klein und jeder kann den Code einfach in sein Hauptskript einbinden, wenn er möchte, dass sein Code mit Bash 4.0 oder neuer läuft, und es benutzt auch nicht eval
.