如何使用Shell脚本在gnuplot中执行命令?


10

我要做的是编写一个脚本,该脚本首先启动一个程序,然后告诉它执行一堆命令,然后退出。让我们举一个例子。

我写了这个脚本myscript.sh,它不能按我想要的方式工作。它只是在运行gnuplot并等待其退出,然后运行其他命令。显然会产生错误。

#!/bin/bash
gnuplot
plot sin(x)
pause -1
quit

我想很清楚我要做什么。如果没有,请在评论中让我知道。

Answers:


12

来自man gnuplot或其在线手册

   -p,  --persist  lets  plot  windows  survive after main gnuplot program
   exits.

   -e "command list" executes the requested commands  before  loading  the
   next input file.

因此,您可能要运行以下命令:

gnuplot -e "plot sin(x); pause -1"

我提出的其他变体但没那么有用的是:

gnuplot -p -e "plot sin(x); pause -1"
gnuplot -e "plot sin(x)"
gnuplot -p -e "plot sin(x)"

前两个产生恰好所需的输出。尽管-p在此示例中用处不大;如果在终端中按Enter键,则gnuplot会退出,并且绘图窗口将完全不具有交互性,但quit命令除外。3rd的输出来去去去(完全不可见)。最后一个产生输出,但是由于gnuplot立即关闭,因此图窗口再次是非交互式的(也显示了一个1平方厘米的小图)。因此pause -1是必要的。
Mihir Gadgil 2015年

@MihirGadgil感谢您的反馈。编辑了我的答案。
字节指挥官

16

一种方法是-persist

#!/usr/bin/gnuplot -persist
set title "Walt pedometer" font ",14" textcolor rgbcolor "royalblue"
set timefmt "%y/%m/%d"
set xdata time
set pointsize 1
set terminal wxt  enhanced title "Walt's steps " persist raise
plot "/home/walt/var/Pedometer" using 1:2 with linespoints

如果需要预处理数据,另一种方法是使用Bash Here Document(请参阅参考资料man bash):

#!/bin/bash
minval=0    # the result of some (omitted) calculation
maxval=4219   # ditto
gnuplot -persist <<-EOFMarker
    set title "Walt pedometer" font ",14" textcolor rgbcolor "royalblue"
    set timefmt "%y/%m/%d"
    set yrange $minval:$maxval
    set xdata time
    set pointsize 1
    set terminal wxt  enhanced title "Walt's steps " persist raise
    plot "/home/walt/var/Pedometer" using 1:2 with linespoints
EOFMarker
# rest of script, after gnuplot exits

1
这个(“ here-doc” shell方法)可能是OP寻找的通用答案。它适用于许多命令驱动程序(如果没有,您可以升级到expect...
Rmano

而且可以使可执行文件,脚本chmod u+x myscript.gnu和直接执行./myscript.gnu 只是说明你忘记了[]在yrange: set yrange [$minval:$maxval]
Hastur

3

man页面中所述,gnuplot期望在批处理会话中来自命令文件的输入。您可以例如将该行写入plot sin(x)文件myplot,然后执行gnuplot myplot

如果省略命令文件(如脚本一样),则将获得一个交互式会话


好吧,我知道它跳入了交互式会话,但是没有办法通过相同的提示将命令输入到该交互式会话中吗?另外,您能给出一个更笼统的答案(不是特定于gnuplot)吗?谢谢!
Mihir Gadgil 2015年

不,并非所有应用程序都以相同方式处理输入。没有办法将其概括。
2015年

@MihirGadgil-并非所有程序都以相同的方式工作...您还要使用其他哪些程序?
Wilf

@乔哦,我明白了,谢谢!Wilf我过去曾经使用过linux,但是没有广泛使用,现在尝试学习更多。我没有任何此类计划。只是想从这个问题中学到很多东西。
Mihir Gadgil 2015年

0

提到的here-doc方法在Gnuplot和许多其他程序中非常有用。通过在here-doc的Gnuplot命令中使用shell变量,您可以使用shell脚本的命令行中的输入参数化绘图。通过轻松设置,您可以从大量“大数据”中批量生产绘图。我曾经使用这种方法在数百个结构动力学有限分析中生成每张图20,000至80,000点的外观一致的散点图。这是一种非常强大的方法。


1
为了使您的答案更完整,您可以添加示例如何使用提到的here-doc方法吗?
Melebius

0

这可能有帮助

{#set terminal postfile             
{#set output  "d1_plot.ps"        
set title "Energy vs. Time for Sample Data"    
set xlabel "Time"    
set ylabel "Energy"    
plot "d1.dat" with lines   
pause -1 "Hit Enter to continue"

点击这里了解更多详情

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.