2011-09-08 111 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"