web-dev-qa-db-fra.com

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

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

Comment appeler b.sh à partir du script shell a.sh?

560
Praveen

Vous pouvez le faire de différentes manières:

  1. Rendez l'autre script exécutable, ajoutez la ligne #!/bin/bash en haut et le chemin d'accès du fichier à la variable d'environnement $ PATH. Ensuite, vous pouvez l'appeler comme une commande normale;

  2. Ou appelez-le avec la commande source (l'alias est .) comme ceci: source /path/to/script;

  3. Ou utilisez la commande bash pour l'exécuter: /bin/bash /path/to/script;

Les première et troisième méthodes exécutent le script en tant que processus différent. Ainsi, les variables et les fonctions de l'autre script ne seront pas accessibles.
La deuxième méthode exécute le script dans le processus du premier script et extrait les variables et les fonctions de l'autre script afin qu'elles soient utilisables à partir du script appelant. 

Dans la seconde méthode, si vous utilisez exit dans le second script, le script sortira également. Ce qui n'arrivera pas dans les première et troisième méthodes.

742

Regarde ça.

#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
181
Budha

Vous pouvez le faire de plusieurs manières. Terminal pour exécuter le script:

#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"

# Here you execute your script
"$SCRIPT_PATH"

# or
. "$SCRIPT_PATH"

# or
source "$SCRIPT_PATH"

# or
bash "$SCRIPT_PATH"

# or
eval '"$SCRIPT_PATH"'

# or
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT

# or
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT

# or
("$SCRIPT_PATH")

# or
(exec "$SCRIPT_PATH")

Tout cela est correct pour le chemin avec des espaces !!!

75
Andrei Krasutski

La réponse que je cherchais:

( exec "path/to/script" )

Comme mentionné, exec remplace le shell sans créer de nouveau processus. Cependant , nous pouvons le mettre dans un sous-shell, ce qui est fait en utilisant les parenthèses. 

EDIT: En fait, ( "path/to/script" ) est suffisant.

51
Maxim Chetrusca

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

 # cat showdate.sh
 #!/bin/bash
 echo "Date is: `date`"

 # cat mainscript.sh
 #!/bin/bash
 echo "You are login as: `whoami`"
 echo "`/bin/sh ./showdate.sh`" # exact path for the script file

La sortie serait:

 # ./mainscript.sh
 You are login as: root
 Date is: Thu Oct 17 02:56:36 EDT 2013
14
Ranjithkumar T

Dépend de . Brièvement ... Si vous voulez charger des variables sur la console actuelle et les exécuter, vous pouvez utiliser source myshellfile.sh sur votre code. Exemple:

!#/bin/bash
set -x
echo "This is an example of run another INTO this session."
source my_lib_of_variables_and_functions.sh
echo "The function internal_function() is defined into my lib."
returned_value=internal_function()
echo $this_is_an_internal_variable

set +x

Si vous voulez juste exécuter un fichier et que le résultat n’intéresse que vous, vous pouvez le faire:

!#/bin/bash
set -x
./executing_only.sh
sh i_can_execute_this_way_too.sh
bash or_this_way.sh
set +x

J'espère que ça vous aide ... Merci.

14
Douglas Bonafé

Ajoutez simplement en ligne tout ce que vous auriez saisi dans un terminal pour exécuter le script!
par exemple.:

#!bin/bash
./myscript.sh &

si le script à exécuter ne se trouve pas dans le même répertoire, utilisez simplement le chemin complet du script.
Exemple ::/home/user/script-directory/./myscript.sh

9
Anon

Une source simple vous aidera ... pour Ex.

#!/bin/bash
echo "My Shell_1"
source my_script1.sh
echo "Back in Shell_1"
7
Nitin Jawarkar

Vous devez d'abord inclure le fichier que vous appelez:

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

alors vous appelez votre fonction comme ceci:

#!/bin/bash
my_called_function
7
Ghazi Triki
pathToShell="/home/praveen/"   
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
4
Abdennour TOUMI
 #!/bin/bash

 # Here you define the absolute path of your script

 scriptPath="/home/user/pathScript/"

 # Name of your script

 scriptName="myscript.sh"

 # Here you execute your script

 $scriptPath/$scriptName

 # Result of script execution

 result=$?
4
Valero

Supposons que le nouveau fichier est "/ home/satya/app/app_specific_env" et que le contenu du fichier est le suivant

#!bin/bash

export FAV_NUMBER="2211"

Ajouter cette référence de fichier au fichier ~/.bashrc

source /home/satya/app/app_specific_env

À chaque fois que vous redémarrez la machine ou que vous vous reconnectez, essayez echo $FAV_NUMBER dans le terminal. Il va sortir la valeur. 

Juste au cas où si vous voulez voir l'effet tout de suite, source ~/.bashrc dans la ligne de commande.

3
Satya Kalluri
chmod a+x /path/to/file-to-be-executed

C'était la seule chose dont j'avais besoin. Une fois que le script à exécuter est rendu exécutable de cette manière, vous (du moins dans mon cas) n'avez besoin d'aucune opération supplémentaire telle que sh ou ./ pendant l'appel du script.

Merci au commentaire de @Nathan Lilienthal 

2
Asqan

Utilisez des backticks.

$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`

Ensuite, récupérez la sortie du script producteur en tant qu'argument du script consommateur.

1
David Cabrera

Il y a quelques problèmes pour importer des fonctions depuis un autre fichier.
First : Vous n'avez pas besoin de faire ce fichier exécutable. Mieux vaut ne pas le faire! 

. file

importer toutes les fonctions. Et tous seront comme s'ils étaient définis dans votre fichier.
Second : Vous pouvez éventuellement définir la fonction avec le même nom. Ce sera écrasé. C'est mauvais. Vous pouvez déclarer comme ça

declare -f new_function_name=old_function_name 

et seulement après cela importez . Vous pouvez donc appeler une ancienne fonction par un nouveau nom.
Troisième : Vous ne pouvez importer que la liste complète des fonctions définies dans le fichier . Si vous n'en avez pas besoin, vous pouvez les désélectionner. Mais si vous réécrivez vos fonctions après la réinitialisation, elles seront perdues. Mais si vous définissez la référence comme décrit ci-dessus, vous pourrez restaurer après la suppression avec le même nom.
Enfin Dans la procédure courante d'importation est dangereux et pas si simple. Faites attention! Vous pouvez écrire un script pour le faire plus facilement et en toute sécurité ..__ Si vous utilisez seulement une partie des fonctions (pas toutes), vous pouvez les diviser en différents fichiers. Malheureusement, cette technique n'est pas bien faite en bash. En python par exemple et dans d’autres langages de script, c’est simple et sûr. Possible de faire une importation partielle seulement les fonctions nécessaires avec ses propres noms. Nous voulons tous que, dans les prochaines versions de Bush, la même fonctionnalité soit appliquée. Mais maintenant, nous devons écrire beaucoup de morue supplémentaire afin de faire ce que vous voulez. 

0
Anatoly