2011-12-23 103 views
2

我做的是Bash腳本gnuplot的繪製數據。但它不起作用。

我有一個程序,其拋出數據到命令行。 我在一個文件上收集這些數據,然後循環這個過程以獲得所需的結果。說我有這個劇本

N = 10 
./program.exe > data_$N.dat # Creating the data to be plotted 
for ((i = 0 ; i<1 ; i++)) do # Dummy loop to throw all together to gnuplot 
    echo "set size square" 
    echo "set xrange[-$N-1:$N+1]; set yrange[-$N-1:$N+1];" 
    echo "plot '-' using 1:2" 
    for((j = 0 ; j <= 9 ; j++)) do 
    # Throwing the data to gnuplot 
    echo "cat data_$N.dat" 
    # Updating the file and overwriting on it 
    echo "cat data_$N.dat | xargs ./program.exe > data_$N.dat" | bash 
    echo "e" 
    echo "pause 0.5" 
    done 
done | gnuplot -persist # Throwing the formatted data to gnuplot 

所以,基本上我把格式化的文本從文件GNUPLOT,改變它的內容,但不改變文件的名稱。

當然,我不想改變文件的名字,因爲我做出相應的與該文件該步驟的計算,然後我用覆蓋更新的數據文件。一種緩衝區。計算流程將是

./program.exe > data.dat # Making the initial data 
begin gnuplot loop 
throw data to gnuplot 
"cat data.dat | xargs ./program.exe > data.dat" # update data overwriting file 
end gnuplot loop 
pipe all the script to gnuplot 

希望是明確的,你可以幫我:)。謝謝!

PD。我是一名物理學家。

回答

5

>重定向外殼環境進行的。所以執行cat data_$N.dat | xargs ./program.exe > data_$N.dat時發生的第一件事是,shell打開data_$N.dat進行寫入並截斷它。現在它是空的,所以當cat開始時它會找到一個文件,但它已被截斷。

你的輸出重定向剛剛到一個臨時位置(這是通常使用在它返回的PID所以你的腳本是有些獨立$$)。所以... > tmp_$$.dat然後就可以mv -f tmp_$$.dat data_$N.dat

+0

好的!但是,這很奇怪...... shell不遵循書面命令? – stringparser 2011-12-23 19:48:38

+3

shell將該命令視爲「PROGRAM |」程序>文件「。 shell的工作是使管道連接兩個程序並打開最終的輸出文件。然後它執行'PROGRAM's,以便它們繼承管道/文件作爲其輸入/輸出。管道的所有元素都在同一時間運行。 – 2011-12-23 19:54:38