2011-09-08 159 views
3

在我的shell腳本中,'wait'不會等待xx.sh,yy.sh和zz.sh退出!爲什麼!退出所有子進程退出

#main.sh 
#!/bin/bash 
idx=0 
while (($idx<1)) 
do`cd ff 
    ./xx.sh >xx& 
    ./yy.sh >yy& 
    ./zz.sh >zz& 
    cd - 
    idx=$(($idx+1)) 
done|ls 
wait 
echo "END" 


#xx.sh,yy.sh,zz.sh is for sleep 
+0

你的腳本似乎甚至沒有解析..什麼是'do'和'cd'之間的倒退? – phs

回答

2

該命令在不同的子shell中運行,因此等待不會等待正確的進程。看到這一點,嘗試

./xx.sh >xx & 
./yy.sh >yy & 
./zz.sh >zz & 
wait #this should wait for all of the processes 

如果你想使用一個循環來產卵,然後生成命令字符串運行,然後在主腳本(內不循環)運行它。

+0

對不起,我沒有完全描述。我需要的是帶有子殼的環路。但是當我添加一個讀取管道時,'wait'不起作用!然而,重定向輸入是完美的!我找不到爲什麼! –

+0

再次閱讀答案。因爲腳本不是父進程;父進程是一個被創建用於運行管道第一步的子shell。 – tripleee

+0

是的,瞭解你的觀點。謝謝!我必須瞭解更多關於管道的信息(我無法確定誰是父shell或子shell)。 –

0
#main.sh 
#!/bin/bash 
idx=0 

(# subshell 
    while (($idx<1)) 
    do 
     echo ./xx.sh \>xx& 
     echo ./yy.sh \>yy& 
     echo ./zz.sh \>zz& 
     sleep 5; 
     echo "all done"; 
     idx=$(($idx+1)) 
    done 
)& FOR=$! 

echo "Waiting for process $FOR" 
wait $FOR 
echo "END"