Ich habe ein Skript, das einige Funktionen hat.
Kann ich eine der Funktionen direkt über die Befehlszeile ausführen?
Etwas wie das?
myScript.sh func()
Wenn das Skript nur die Funktionen definiert und nichts anderes tut, können Sie das Skript zuerst im Kontext der aktuellen Shell mit dem Befehl source
oder ausführen .
und dann einfach die Funktion aufrufen. Siehe help source
für weitere Informationen.
exit
in Ihrer Funktion das Terminal nach Ausführung der Funktion geschlossen wird. Gibt es einen Weg daran vorbei? @SvenMarnachbash
) undexit
beenden nur die Unterschale, nicht jedoch Ihr Terminal.Nun, während die anderen Antworten richtig sind, können Sie sicherlich noch etwas anderes tun: Wenn Sie Zugriff auf das Bash-Skript haben, können Sie es ändern und einfach am Ende den speziellen Parameter
"$@"
einfügen, der auf die Argumente der Befehlszeile erweitert wird Sie geben an, und da es "allein" ist, versucht die Shell, sie wörtlich zu nennen. und hier können Sie den Funktionsnamen als erstes Argument angeben. Beispiel:Zum Polieren können Sie zunächst überprüfen, ob der Befehl vorhanden ist und eine Funktion ist:
quelle
"$@"
in den meisten Fällen.$@
ist in einigen Fällen nicht sicher.bash test.sh testA testB
?[ ! -z "$1" ]
anderen Quelle verpackt werden, die die else-Anweisung in einigen Bash-Versionen auslöstDer folgende Befehl registriert die Funktion zuerst im Kontext und ruft sie dann auf:
quelle
Kurz gesagt, nein.
Sie können alle Funktionen des Skripts mit
source
(help source
für Details) in Ihre Umgebung importieren , um sie dann aufzurufen. Dies hat auch den Effekt, dass das Skript ausgeführt wird. Seien Sie also vorsichtig.Es gibt keine Möglichkeit, eine Funktion aus einem Shell-Skript heraus aufzurufen, als wäre es eine gemeinsam genutzte Bibliothek.
quelle
Verwenden von
case
Dieses Skript führt die Funktionen fun1 und fun2 aus. Wenn Sie es jedoch mit der Option fun1 oder fun2 starten, wird die angegebene Funktion nur mit args (falls vorhanden) ausgeführt und beendet. Verwendung
quelle
Bearbeiten: WARNUNG - scheint nicht in allen Fällen zu funktionieren, funktioniert aber bei vielen öffentlichen Skripten gut.
Wenn Sie ein Bash-Skript namens "control" haben und darin eine Funktion namens "build" haben:
Dann können Sie es so aufrufen (aus dem Verzeichnis, in dem es sich befindet):
Wenn es sich in einem anderen Ordner befindet, würde dies Folgendes bewirken:
Wenn Ihre Datei "control.sh" heißt, würde dies die Funktion dementsprechend wie folgt aufrufen:
quelle
. ./control.sh && build
Ich habe eine Situation, in der ich eine Funktion aus dem Bash-Skript benötige, die vorher nicht ausgeführt werden darf (z. B. von
source
), und das Problem dabei@$
ist, dass myScript.sh dann anscheinend zweimal ausgeführt wird ... Also bin ich auf die Idee gekommen um die Funktion mit sed herauszuholen:sed -n "/^func ()/,/^}/p" myScript.sh
Und um es zu dem Zeitpunkt auszuführen, zu dem ich es brauche, lege ich es in eine Datei und verwende
source
:sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
quelle
Sie können die Funktion über das Befehlszeilenargument wie unten aufrufen
Sobald Sie die Funktion beendet haben, setzen Sie $ 1, um das Argument zu akzeptieren. Angenommen, der obige Code wird in fun.sh gespeichert, um die Funktion ./fun.sh irfan & ./fun.sh config auszuführen
quelle
Gelöster Beitrag, aber ich möchte meine bevorzugte Lösung erwähnen. Definieren Sie nämlich ein generisches Einzeilenskript
eval_func.sh
:Rufen Sie dann eine beliebige Funktion in einem Skript auf über:
Ein Problem, auf das ich bei der akzeptierten Lösung gestoßen bin, ist, dass beim Beschaffen meines funktionshaltigen Skripts in einem anderen Skript die Argumente des letzteren vom ersteren ausgewertet werden und einen Fehler verursachen.
quelle