Réponses:
Si le script définit uniquement les fonctions et ne fait rien d'autre, vous pouvez d'abord exécuter le script dans le contexte du shell actuel en utilisant la commande source
ou .
, puis appeler simplement la fonction. Voir help source
pour plus d'informations.
bash
), et exit
ne terminera que le sous-shell, mais pas votre terminal.
Eh bien, alors que les autres réponses sont correctes - vous pouvez certainement faire autre chose: si vous avez accès au script bash, vous pouvez le modifier, et placer simplement à la fin le paramètre spécial "$@"
- qui s'étendra aux arguments de la ligne de commande vous spécifiez, et comme il est "seul", le shell essaiera de les appeler textuellement; et ici, vous pouvez spécifier le nom de la fonction comme premier argument. Exemple:
$ 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
Pour le polonais, vous pouvez d'abord vérifier que la commande existe et est une fonction:
# 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
"$@"
dans la plupart des cas. $@
n'est pas sûr dans certains cas.
bash test.sh testA testB
?
[ ! -z "$1" ]
sinon la source lèvera l'instruction else dans certaines versions de bash
La commande suivante enregistre d'abord la fonction dans le contexte, puis l'appelle:
. ./myScript.sh && function_name
En bref, non.
Vous pouvez importer toutes les fonctions du script dans votre environnement avec source
(help source
pour plus de détails), ce qui vous permettra ensuite de les appeler. Cela a également pour effet d'exécuter le script, alors faites attention.
Il n'y a aucun moyen d'appeler une fonction à partir d'un script shell comme s'il s'agissait d'une bibliothèque partagée.
En utilisant 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
Ce script exécutera les fonctions fun1 et fun2 mais si vous le démarrez avec l'option fun1 ou fun2, il n'exécutera que la fonction donnée avec args (si fourni) et quittera. Usage
$ ./test
run function1
run function2
$ ./test fun2 a b c
run function2
options: a b c
Edit: AVERTISSEMENT - semble que cela ne fonctionne pas dans tous les cas, mais fonctionne bien sur de nombreux scripts publics.
Si vous avez un script bash appelé "control" et qu'il contient une fonction appelée "build":
function build() {
...
}
Ensuite, vous pouvez l'appeler comme ceci (à partir du répertoire où il se trouve):
./control build
Si c'est dans un autre dossier, cela ferait:
another_folder/control build
Si votre fichier s'appelle "control.sh", cela rendrait la fonction appelable comme ceci:
./control.sh build
. ./control.sh && build
J'ai une situation où j'ai besoin d'une fonction du script bash qui ne doit pas être exécutée avant (par exemple par source
) et le problème @$
est que myScript.sh est ensuite exécuté deux fois, semble-t-il ... J'ai donc eu l'idée pour sortir la fonction avec sed:
sed -n "/^func ()/,/^}/p" myScript.sh
Et pour l'exécuter au moment où j'en ai besoin, je le mets dans un fichier et j'utilise source
:
sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
vous pouvez appeler la fonction à partir de l'argument de ligne de commande comme ci-dessous
function irfan() {
echo "Irfan khan"
date
hostname
}
function config() {
ifconfig
echo "hey"
}
$1
une fois la fonction end mettez $ 1 pour accepter l'argument, disons que le code ci-dessus est enregistré dans fun.sh pour exécuter la fonction ./fun.sh irfan & ./fun.sh config
Message résolu mais j'aimerais mentionner ma solution préférée. À savoir, définissez un script générique à une seule ligne eval_func.sh
:
#!/bin/bash
source $1 && shift && "@a"
Appelez ensuite n'importe quelle fonction dans n'importe quel script via:
./eval_func.sh <any script> <any function> <any args>...
Un problème que j'ai rencontré avec la solution acceptée est que lors de la recherche de mon script contenant une fonction dans un autre script, les arguments de ce dernier seraient évalués par le premier, provoquant une erreur.
exit
dans votre fonction, elle fermera le terminal après l'exécution de la fonction. Y a-t-il un moyen de contourner cela? @SvenMarnach