2016-05-11 20 views
0

2つのPhantomJSタスクを実行するためのBashファイルを作成しています。Bashコマンドはwhileループで1回だけ実行されます

外部JSファイルには、task1.js & task2.jsという2つのタスクがあります。

ここに私のbashスクリプトは、これまでのところです:タスク2は、一度だけ実行されているいくつかの未知の理由

#!/bin/bash 

url=$1 

cd $(cd $(dirname ${BASH_SOURCE}); pwd -P) 

dir=../temp 
mkdir -p $dir 
file=$dir/file.txt 
phantomjs "taks1.js" $url > $file 

while IFS="" read -r line || [[ -n $line ]]; do 
    dir=../build 
    file=$dir/$line.html 
    mkdir -p $(dirname $file) 
    phantomjs "task2.js" $url $line > $file 
done < $file 

、スクリプトは停止します。

PhantomJSコマンドを削除すると、ファイルからすべての行が読み込まれるまで、whileループが正常に実行されます。

多分誰かがそれを知っていますか?

乾杯。

+2

'phantomjs'ラインに置く' <は/ dev/null'なので。 –

+0

ところで、http://shellcheck.net/であなたのコードを実行してください - それはバグなどを引用しています。 –

+0

Julius:* task2.jsはstdinから読み込みますか? @Charlesが彼のコメントで示唆するように、それはphantomjsスクリプトにとって奇妙な振る舞いのように思えるかもしれませんが、何が起こっているのかを説明することもできます。 – rici

答えて

4

ループがstdinから内容を読み込んでいます。実行している他のプログラムがstdinを消費すると、ループは終了します。

stdinを消費している可能性のあるプログラムを/dev/nullから読み取るか、ループに別のFDを使用してください。

最初のアプローチは、次のようになります。

phantomjs "task2.js" "$url" "$line" >"$file" </dev/null 

第二は、この(そのファイルディスクリプタからの読み取りにリダイレクトを確立することに3<に注意してください、そして<&3)のようになります。

while IFS="" read -r line <&3 || [[ -n $line ]]; do 
    dir=../build 
    file=$dir/$line.html 
    mkdir -p "$(dirname "$file")" 
    phantomjs "task2.js" "$url" "$line" >"$file" 
done 3< $file 

ところで、fileをループから外してみると、ループを読み取ると、di rectly最初phantomjsプログラムの出力から:

while IFS="" read -r line <&3 || [[ -n $line ]]; do 
    dir=../build 
    file=$dir/$line.html 
    mkdir -p "$(dirname "$file")" 
    phantomjs "task2.js" "$url" "$line" >"$file" 
done 3< <(phantomjs "task1.js" "$url") 
関連する問題