2010-06-02 83 views
0

我想要一個簡單的測試shell腳本,它並行啓動一個程序N次,並將每個不同的輸出保存到不同的文件中。我已經開始並行啓動程序並保存輸出,但我怎樣才能只保留不同的輸出?另外我怎樣才能讓echo DONE!表明結束?用於測試的shell腳本

#!/bin/bash 

N=10 

for((i=1; j<=$N; ++i)); do 
    ./test > output-$N & 
done 
echo DONE! 
+0

正如有人在一個現在被刪除的答案中指出的,'j'應該是'i'。同樣''output-$ N''將用每次測試覆蓋相同的文件「output-10」。我很確定你想'output- $ i',所以你有十個不同的輸出文件。 – 2010-06-02 21:54:46

回答

3

你需要使用內建命令wait。

等待[N ...]

等待每個指定的進程,返回它的終止狀態。每個n可以是進程ID或工作規範;如果給出了工作規範,則等待該作業管道中的所有進程。如果沒有給出n,則等待所有當前活動的子進程,返回狀態爲零。如果n指定不存在的進程或作業,則返回狀態爲127.否則,返回狀態爲最後進程或作業等待的退出狀態。

你可以指定你的工作爲%1%2,...:

wait %1 %2 %3 ... 

但只要你有沒有其他的子進程,你可以不帶參數的使用;然後它會等待所有的子進程來完成:

for ...; do 
    ... 
done 
wait 
echo "All done!" 

你的另外一個問題,如何保持唯一不同的輸出,是有點麻煩。你究竟是什麼意思 - 不同於什麼?如果你有一個底線,你可以這樣做:

for ...; do 
    if diff -q $this_output $base_output; then 
     # files are identical 
     rm $this_output 
    fi 
done 

如果你想保留的所有獨特的輸出,該算法是一個稍微複雜一些,很明顯,但你仍然可以使用diff -q來測試相同的輸出。

2

爲了讓你的輸出表明,所有的過程都完成後,你需要調用wait

#!/bin/bash 
N=10 

for((i=1; j<=$N; ++i)); do 
    ./test > output-$N & 
done 
wait # wait until all jobs are finished 
echo DONE!