2010-02-16 49 views
21

Tôi có 1 tập lệnh bash chạy tập lệnh bash khác, tuy nhiên bashscript đầu tiên không đợi mã thứ hai hoàn thành trước khi tiếp tục, làm thế nào tôi có thể ép nó đợi?Bash Script Gọi một tập lệnh bash khác và chờ cho nó hoàn thành trước khi tiếp tục

Ví dụ:

#!/bin/bash 
# first.sh 

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

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

Cách nó bây giờ, nó sẽ chạy second.sh, và tiếp tục trên, không chờ second.sh để hoàn thành.

+3

Nên chờ đợi; đó có thực sự là toàn bộ kịch bản của bạn không? –

Trả lời

13

Bình thường; một cái gì đó khác đang xảy ra. Bạn có chắc chắn rằng tập lệnh khác không chạy một cái gì đó trong nền thay thế? Bạn có thể thử sử dụng wait bất kể.

+2

'chờ đợi' chỉ chờ đợi cho trẻ em trực tiếp của bash mẹ; nếu đứa trẻ chạy một cái gì đó trong nền và thoát, quá trình cha mẹ không thể chờ đợi cho nó bởi vì nó được thừa hưởng bởi 'PID 1' - quá trình init. (Trừ khi một cái gì đó đã thay đổi đáng kể mà tôi không biết.) –

1

hãy thử sử dụng bash second.sh và kiểm tra second.sh của bạn và chắc chắn rằng bạn không có chương trình chạy ở chế độ nền

7

Bạn chỉ có thể thêm các lệnh wait sau khi bạn thực thi kịch bản thứ hai, nó sẽ đợi cho tất cả quá trình mà bạn khởi động từ kịch bản chính của bạn

bạn thậm chí có thể hồi phục PID của kịch bản thứ hai của bạn bằng cách sử dụng lệnh echo $! trực tiếp sau khi bạn gọi kịch bản thứ hai, và sau đó vượt qua PID này như một cuộc tranh cãi với wait lệnh

11

Vì tôi sử dụng lược đồ như thế này trong vài kịch bản - chỉ cần gọi các tập lệnh thứ hai trong cùng một bản sao vỏ bằng cách sử dụng source.

Trong script-1:

source script2.sh 

hay:

. script2.sh 

Vì vậy - không có một lệnh trong script-1 sẽ không được tiến hành cho đến khi script2.sh sẽ kết thúc tất cả các nhiệm vụ của nó.

Ví dụ nhỏ.

kịch bản đầu tiên:

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

source script-2.sh 

echo "script-2.sh finished!" 

kịch bản thứ hai:

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

Cách hoạt động:

$ ./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

Tôi ngạc nhiên rằng điều này đã không nhận được nhiều phiếu bầu hơn. Đây chính xác là những gì mà OP yêu cầu. –

Các vấn đề liên quan