我有一个这样的gnuplot脚本(简化)
reset session
set terminal pngcairo enhanced font "Times,25" size 800,400
filename = ifilename
stats filename nooutput
N = STATS_columns
M = STATS_records
set angles degrees
set size square 1.25,1
set output ofilename
# does some stuff
...
...
...
set parametric
plot \
for [i=2:N] filename u (posX($0, column(i))):(posY($0, column(i))) w p ps 1.2 pt 7 lc rgb lcolor(i-2)
我想做的是通过Shell脚本定义ifilename
(输入文件)和ofilename
(输出文件)。
所以我认为-e
命令可能只是这项工作。
所以对于脚本的gnuploat部分,我为此感到恼怒
gnuplot -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp
但是它抛出了错误
"chart.gp" line 8: undefined variable: ifilename
引用此行
filename = ifilename
我认为这可能是因为解析两个=
符号时遇到了一些麻烦,所以我删除了这一行并像这样重写了我的shell脚本
gnuplot -e "filename='data/points_data1.dat'; ofilename='plot1'" chart.gp
但这一次它引发了以下错误
"chart.gp" line 8: undefined variable: filename
实际起作用的是
echo "data/points_data$i.dat" | gnuplot chart.gp
我将filename = ifilename
行替换为
FILE = system("read filename; echo $filename")
以及filename
脚本中带有FILE
的{{1}}的每个实例。
但是我不确定如何使用该语法来定义输出文件。
所以我想知道,是否有更好的方法将外壳程序输入管道传递到gnuplot脚本?
答案 0 :(得分:1)
您的原始命令几乎奏效。调用
gnuplot -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp
正确定义了输入和输出文件名。但是然后您通过发出命令将它们破坏在chart.gp脚本中
reset session
清除所有变量定义,包括您特别想要的变量。从脚本中删除该行,就可以了。如果“重置会话”命令的目的是确保不使用系统范围的或专用的初始化文件,则在命令行上将其替换为“ -d”:
gnuplot -d -e "ifilename='data/points_data1.dat'; ofilename='plot1'" chart.gp
答案 1 :(得分:0)
FILE = system("read filename; echo $filename")
实际上很好。
如果要将输出通过管道传输到某个文件,则可以省略set output "something.png"
,相反,您可以通过运行这样的脚本直接将.png
的输出直接发送到stdout
#!/usr/bin/env gnuplot
reset session
set terminal pngcairo enhanced font "Times,25" size 800,400
...
然后您可以将输出通过管道传输到.png
文件,像这样
./chart.gp > mypng.png
因此,最终命令是这个样子
echo "data/points_data$i.dat" | gnuplot chart.gp > plot$i.png