Antworten:
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.
bash
) und exit
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:
$ cat test.sh
testA() {
echo "TEST A $1";
}
testB() {
echo "TEST B $2";
}
"$@"
$ bash test.sh
$ bash test.sh testA
TEST A
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2
Zum Polieren können Sie zunächst überprüfen, ob der Befehl vorhanden ist und eine Funktion ist:
# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
# call arguments verbatim
"$@"
else
# Show a helpful error
echo "'$1' is not a known function name" >&2
exit 1
fi
"$@"
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öst
Der folgende Befehl registriert die Funktion zuerst im Kontext und ruft sie dann auf:
. ./myScript.sh && function_name
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.
Verwenden von case
#!/bin/bash
fun1 () {
echo "run function1"
[[ "$@" ]] && echo "options: $@"
}
fun2 () {
echo "run function2"
[[ "$@" ]] && echo "options: $@"
}
case $1 in
fun1) "$@"; exit;;
fun2) "$@"; exit;;
esac
fun1
fun2
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
$ ./test
run function1
run function2
$ ./test fun2 a b c
run function2
options: a b c
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:
function build() {
...
}
Dann können Sie es so aufrufen (aus dem Verzeichnis, in dem es sich befindet):
./control build
Wenn es sich in einem anderen Ordner befindet, würde dies Folgendes bewirken:
another_folder/control build
Wenn Ihre Datei "control.sh" heißt, würde dies die Funktion dementsprechend wie folgt aufrufen:
./control.sh build
. ./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
Sie können die Funktion über das Befehlszeilenargument wie unten aufrufen
function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1
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
Gelöster Beitrag, aber ich möchte meine bevorzugte Lösung erwähnen. Definieren Sie nämlich ein generisches Einzeilenskript eval_func.sh
:
#!/bin/bash
source $1 && shift && "@a"
Rufen Sie dann eine beliebige Funktion in einem Skript auf über:
./eval_func.sh <any script> <any function> <any args>...
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.
exit
in Ihrer Funktion das Terminal nach Ausführung der Funktion geschlossen wird. Gibt es einen Weg daran vorbei? @SvenMarnach