J'ai un script qui a quelques fonctions.
Puis-je exécuter l'une des fonctions directement à partir de la ligne de commande?
Quelque chose comme ça?
myScript.sh func()
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.
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? @SvenMarnachbash
), etexit
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:Pour le polonais, vous pouvez d'abord vérifier que la commande existe et est une fonction:
la source
"$@"
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 bashLa commande suivante enregistre d'abord la fonction dans le contexte, puis l'appelle:
la source
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.
la source
En utilisant
case
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
la source
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":
Ensuite, vous pouvez l'appeler comme ceci (à partir du répertoire où il se trouve):
Si c'est dans un autre dossier, cela ferait:
Si votre fichier s'appelle "control.sh", cela rendrait la fonction appelable comme ceci:
la source
. ./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
la source
vous pouvez appeler la fonction à partir de l'argument de ligne de commande comme ci-dessous
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
la source
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
:Appelez ensuite n'importe quelle fonction dans n'importe quel script via:
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.
la source