J'ai deux scripts Shell, a.sh
et b.sh
.
Comment appeler b.sh
à partir du script shell a.sh
?
Vous pouvez le faire de différentes manières:
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;
Ou appelez-le avec la commande source
(l'alias est .
) comme ceci: source /path/to/script
;
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.
Regarde ça.
#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."
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 !!!
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.
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
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.
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
Une source simple vous aidera ... pour Ex.
#!/bin/bash
echo "My Shell_1"
source my_script1.sh
echo "Back in Shell_1"
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
pathToShell="/home/praveen/"
chmod a+x $pathToShell"myShell.sh"
sh $pathToShell"myShell.sh"
#!/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=$?
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.
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
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.
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.