bash在循环"〜$./ program> file.dat"时删除我的文件(gnuplot)

str*_*ser 2 bash gnuplot computation

我在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
Run Code Online (Sandbox Code Playgroud)

所以,基本上我将格式化文本从文件中抛出到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
Run Code Online (Sandbox Code Playgroud)

希望很明确,你可以帮助我:).谢谢!

PD.我是一名物理学家.

Ben*_*son 5

重定向>由shell完成.因此,执行时发生的第一件事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.

  • shell将该命令视为`PROGRAM | 计划>文件.shell的工作是使管道连接两个程序并打开最终的输出文件.然后它执行`PROGRAM`s,以便它们继承管道/文件作为它们的输入/输出.管道的所有元素都在同一时间运行. (3认同)