Comment appeler les fonctions bash


28

Peut-être que je regarde ça dans le mauvais sens .. Mais ici, je suis ce que j'essaie de faire. Je fais l'essentiel de mon travail avec Java, mais je viens de passer à un environnement unix (bash). Je fais ça:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

Mais j'ai deux fonctions dans mon fichier et je veux pouvoir les appeler séparément de la ligne de commande. C'est à dire: myFunc.ls2()ou même juste ls2. Je sais que je peux ajouter les fonctions à mon .bashrcfichier, mais existe-t-il un autre moyen d'exécuter ces fonctions sans les ajouter à mon .bashrc?

Réponses:


26

Une façon de le faire, qui implique un peu plus de frappe, est via la sourcecommande. Pour appeler une fonction à partir de myFunc, vous pourriez utiliser source myFunc; ls2et cela produirait Hello World.

Ainsi, par exemple, j'ai un fichier appelé say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

maintenant je veux appeler sa talk()fonction depuis la ligne de commande:

[john @ awesome ~] $ source say.sh; parler
salut!

pour l'appeler à partir d'un autre script bash:

#!/bin/bash
source say.sh
talk

Vous pouvez également mettre chacun dans un script séparé et les ajouter dans un répertoire qui se trouve dans votre variable PATH.

Ainsi, par exemple, dans un script appelé, hellovous auriez:

#!/bin/bash
echo "Hello World"

placez-le maintenant dans l'un des répertoires de votre PATH, que vous pouvez voir en exécutant echo $PATH. Vous pouvez ajouter un autre répertoire à votre CHEMIN si vous le souhaitez ou utiliser un répertoire existant. Une fois que vous y avez copié le fichier, rendez-le exécutable avec chmod +x filename.


3
Juste pour être clair: vous ne devez vous procurer le fichier qu'une seule fois par script ou au démarrage du shell. Vous pouvez appeler la fonction autant de fois que vous le souhaitez sans faire de nouveau référence au fichier source.
pause jusqu'à nouvel ordre.

5

Une autre approche serait de créer un script appelé functions.sh(dans le ~/binrépertoire par exemple).

Dans ce script, vous ajoutez toutes vos définitions de fonctions personnelles (disons que chaque fois que vous ajoutez une fonction, vous l'ajoutez à ce fichier ...)

Enfin, il vous suffit d'ajouter la source ~/bin/functions.shligne à votre .bashrcfichier. De cette façon, vous pourrez les appeler à partir de la ligne de commande, vous .bashrcresterez propre et vous aurez une place spécifique pour vos fonctions personnelles.


5

Si vous êtes comme moi, vous ne voulez pas encombrer votre environnement de fonctions. Vous avez également un groupe de fonctions qui vont ensemble en termes de ce qu'elles font, il est donc logique de les placer dans le même fichier de script. (Je sais qu'un dossier avec plusieurs fichiers pourrait servir le même but). Voici une solution possible qui vous permet d'appeler une fonction spécifique dans le script:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

J'aime beaucoup plus que sourcecela, car il peut gérer deux fonctions du même nom dans deux fichiers sh différents. Je l'ai affiné pour gérer un nombre arbitraire de paramètres en le remplaçant $1 $2 $3 $4 $5parFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur

@ChuckWilbur: Pourquoi sauter à travers des cerceaux? Remplacez simplement la dernière ligne par "$@". PS Votre approche est en fait fausse; la dernière partie doit être "$FUNC_CALL" "$@"  (c'est-à-dire  $FUNC_CALLdoit être entre guillemets).
Scott

Qu'est-ce que c'est "$FUNC_CALL"?
ctrl-alt-delor

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.