965 votes

Shell: Comment appeler un script shell à partir d'un autre script shell?

J'ai deux scripts shell, a.sh et b.sh.

Comment puis-je appeler b.sh depuis le script shell a.sh ?

8 votes

Pouvez-vous donner des détails : quel système d'exploitation et quel(s) shell(s) utilisez-vous ou parlez-vous simplement de ce problème dans le principe ? Un exemple de code serait également utile.

17 votes

Il ne s'agit pas réellement d'une question spécifique et ne démontre pas d'effort préalable pour résoudre le problème.

1 votes

Un problème que j'avais était que b.sh n'avait pas les permissions d'exécution. Il serait bon de vérifier.

1181voto

Joachim Pileborg Points 121221

Il existe plusieurs façons de procéder :

  1. Rendre le script exécutable avec chmod a+x /chemin/du/fichier(commentaire de Nathan Lilienthal), ajouter la ligne #!/bin/bash (appelée shebang) en haut, et ajouter le chemin du fichier à la variable d'environnement $PATH. Ensuite, vous pouvez l'appeler comme une commande normale;

  2. Ou l'appeler avec la commande source (qui est un alias pour .), comme ceci :

    source /chemin/du/script
  3. Ou utiliser la commande bash pour l'exécuter, comme :

    /bin/bash /chemin/du/script

Les première et troisième approches exécutent le script en tant qu'un autre processus, donc les variables et fonctions dans l'autre script ne seront pas accessibles.
La deuxième approche exécute le script dans le processus du premier script, et récupère les variables et fonctions de l'autre script (donc elles sont utilisables à partir du script appelant). Bien entendu, cela exécutera toutes les commandes dans l'autre script, pas seulement définir des variables.

Dans la deuxième méthode, si vous utilisez exit dans le deuxième script, cela va aussi quitter le premier script. Ce qui n'arriverait pas dans les première et troisième méthodes.

46 votes

N'oubliez pas de chmod a+x /chemin/vers/fichier sinon il ne sera pas exécutable. S'applique uniquement à la méthode ./script.

4 votes

N'oubliez pas de modifier le format / encodage des fichiers exécutables dans Unix s'ils ont été créés dans DOS puis téléchargés dans l'environnement Unix -> dos2unix

2 votes

Aussi, notez que la portée de chaque script est le niveau supérieur du répertoire de votre projet - si ./.git/hooks/pre-commit a source foo, vous feriez mieux d'avoir ./foo!

261voto

Budha Points 361

Vérifiez cela.

#!/bin/bash
echo "Ce script va exécuter un autre script."
sh ./script.sh
echo "Ce script vient d'exécuter un autre script."

4 votes

Cela suppose que le script.sh se trouve dans le même répertoire que le script en cours d'exécution. Si vous vouliez appeler un script ailleurs, vous diriez sh /script.sh

49 votes

Cela utilise également deux shells, bash et sh. Même lorsque sh est en fait bash, il ne se comporte pas de la même manière. Si vous utilisez #!/bin/bash, alors vous voulez probablement utiliser bash script.sh (ou simplement ./script.sh pour utiliser le hashbang de ce script).

1 votes

Continuait à recevoir une erreur de permission refusée même lorsque j'ai défini chmod +x sur le fichier .sh. Des suggestions?

16voto

Ranjithkumar T Points 344

Vous pouvez utiliser /bin/sh pour appeler ou exécuter un autre script (via votre script actuel) :

 # cat showdate.sh
 #!/bin/bash
 echo "La date est : `date`"

 # cat mainscript.sh
 #!/bin/bash
 echo "Vous êtes connecté en tant que : `whoami`"
 echo "`/bin/sh ./showdate.sh`" # chemin exact du fichier script

La sortie serait :

 # ./mainscript.sh
 Vous êtes connecté en tant que : root
 Date is: Thu Oct 17 02:56:36 EDT 2013

1 votes

Surement cela lancera showdate.sh sous /bin/sh plutôt que /bin/bash?

0 votes

J'ai essayé avec "/bin/sh ./showdate.sh", "/bin/bash ./showdate.sh", "./showdate.sh" et exécuté le fichier : mainscript.sh et obtenu le même résultat.

11voto

Ghazi Triki Points 16

Tout d'abord, vous devez inclure le fichier que vous appelez :

#!/bin/bash
. includes/included_file.sh

puis vous appelez votre fonction comme ceci :

#!/bin/bash
my_called_function

5voto

pathToShell="/home/praveen/"
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X