web-dev-qa-db-fra.com

Comment puis-je exécuter une fonction à partir d'un script en ligne de commande?

J'ai un script qui a certaines fonctions.

Puis-je exécuter l'une des fonctions directement depuis la ligne de commande?

Quelque chose comme ça?

myScript.sh func()
85
AAaa

Si le script définit uniquement les fonctions et ne fait rien d'autre, vous pouvez d'abord l'exécuter dans le contexte du shell actuel à l'aide de la commande source ou ., puis simplement appeler la fonction. Voir help source pour plus d'informations.

45
Sven Marnach

Bien que les autres réponses soient exactes, vous pouvez certainement faire autre chose: si vous avez accès au script bash, vous pouvez le modifier et simplement placer à la fin le paramètre spécial "$@" - qui étendra les arguments de la commande la ligne que vous spécifiez, et comme elle est "seule", le Shell essaiera de les appeler mot à mot; 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
169
sdaau

La commande suivante enregistre d’abord la fonction dans le contexte, puis l’appelle:

. ./myScript.sh && function_name
22
TimonWang

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’est pas possible d’appeler une fonction à partir d’un script Shell comme s’il s’agissait d’une bibliothèque partagée.

11
Sorpigal

Edit: WARNING - 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 à l'intérieur de celui-ci vous avez une fonction appelée "build":

function build() { 
  ... 
}

Ensuite, vous pouvez l'appeler comme ceci (depuis le 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", la fonction sera appelable comme ceci:

./control.sh build
0
Arturas M