2010-02-16 7 views
21

J'ai un script bash qui exécute un autre script bash, cependant le premier bashscript n'attend pas que le second se termine avant de continuer, comment puis-je le forcer attendre?Script Bash Appelle un autre script bash et attend qu'il se termine avant de continuer

Par exemple:

#!/bin/bash 
# first.sh 

#call to secondary script 
sh second.sh 
echo "second.sh has completed" 

echo "continuing with the rest of first.sh..." 

La façon dont il est maintenant, il fonctionnera second.sh, et continuer, sans attendre second.sh pour terminer.

+3

Il faut attendre; est-ce vraiment tout votre script? –

Répondre

13

Normalement c'est le cas; quelque chose d'autre se passe. Etes-vous sûr que l'autre script ne fonctionne pas en arrière-plan? Vous pouvez essayer d'utiliser wait indépendamment.

+2

'wait' n'attend que les enfants directs du parent bash; Si l'enfant exécute quelque chose en arrière-plan et quitte, le processus parent ne peut pas l'attendre car il est hérité par 'PID 1' - le processus init. (Sauf si quelque chose a changé de façon dramatique que je ne sais pas.) –

1

essayez d'utiliser bash second.sh et vérifiez votre second.sh et assurez-vous que vous ne disposez pas des programmes qui fonctionnent en arrière-plan

7

Vous pouvez simplement ajouter la commande wait après l'exécution du second script, il attendra tous processus que vous lancez à partir de votre script principale

vous pouvez même récupérer le PID de votre second script en utilisant la commande echo $! directement après que vous appelez le second script, et passez ensuite ce PID comme argument à la commande wait

11

AS J'utilise un schéma comme celui-ci dans quelques scripts - en appelant simplement des seconds scripts dans la même copie shell en utilisant source.

En script-1:

source script2.sh 

ou:

. script2.sh 

donc - pas une commande dans script-1 ne sera pas procédé à script2.sh mettra fin à toutes ses tâches.

Petit exemple.

premier script:

$ cat script-1.sh 
#!/bin/bash 
echo "I'm sccript $0." 
echo "Runnig script-2..." 

source script-2.sh 

echo "script-2.sh finished!" 

Deuxième scénario:

$ cat script-2.sh 
#bin/bash 
echo "I'm script-2. Running wait operation..." 
sleep 2 
echo "I'm ended my task." 

Comment ça marche:

$ ./script-1.sh 
I'm sccript ./script-1.sh. 
Runnig script-2... 
I'm script-2. Running wait operation... 
I'm ended my task. 
script-2.sh finished! 
+2

Je suis surpris que cela n'ait pas eu plus de votes. C'est exactement ce que l'OP a demandé. –