Wie führe ich Befehle in Gnuplot mit einem Shell-Skript aus?


10

Ich möchte ein Skript schreiben, das zuerst ein Programm startet und es dann anweist, eine Reihe von Befehlen auszuführen und dann zu beenden. Gehen wir mit einem Beispiel.

Ich habe dieses Skript geschrieben myscript.shund es funktioniert nicht so, wie ich es möchte. Führen Sie einfach gnuplot aus und warten Sie, bis es beendet ist. Führen Sie dann die anderen Befehle aus. was offensichtlich zu Fehlern führt.

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

Ich denke, es ist klar, was ich versuche zu tun; Wenn nicht, dann lass es mich in den Kommentaren wissen.

Antworten:


11

Von man gnuplotoder seiner Online-Manpage :

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

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

Was Sie also wahrscheinlich ausführen möchten, ist der folgende Befehl:

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

Andere Varianten, die ich vorgeschlagen habe, die aber nicht so nützlich sind, waren:

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

Die ersten 2 erzeugen genau die gewünschte Ausgabe. Obwohl -pin diesem Beispiel nicht viel von Nutzen ist; Wenn Sie im Terminal die Eingabetaste drücken, wird gnuplot beendet und das Plotfenster wird bis auf den Befehl quit vollständig nicht mehr interaktiv. Der Ausgang des 3. kommt und geht (überhaupt nicht sichtbar). Der letzte erzeugt eine Ausgabe, aber da Gnuplot sofort geschlossen wird, ist das Plotfenster wieder nicht interaktiv (außerdem zeigt es ein winziges 1-Quadrat-cm-Plot). Also pause -1ist es notwendig.
Mihir Gadgil

@MihirGadgil Danke für das Feedback. Ich habe meine Antwort bearbeitet.
Byte Commander

15

Ein Weg ist mit -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

Eine andere Möglichkeit, wenn Sie Daten vorverarbeiten müssen, ist ein Bash Here Document(siehe 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
Dies (die Shell-Methode "here-doc") ist wahrscheinlich die generische Antwort, nach der das OP gesucht hat. Es wird für viele befehlsgesteuerte Programme funktionieren (und wenn nicht, können Sie zu expect...
Rmano

Darüber hinaus können Sie die Skripte ausführbar machen chmod u+x myscript.gnuund direkt ausführen. ./myscript.gnu Nur eine Notiz, die Sie im Bereich vergessen []haben : set yrange [$minval:$maxval].
Hastur

3

Erwartet, wie auf den manSeiten erläutert , die gnuplotEingabe einer Befehlsdatei in einer sogenannten Batch-Sitzung . Sie können zB die Zeile plot sin(x)in eine Datei schreiben myplotund dann ausführen gnuplot myplot.

Wenn Sie die Befehlsdatei wie in Ihrem Skript weglassen, erhalten Sie eine interaktive Sitzung .


Okay, ich verstehe, dass es in eine interaktive Sitzung springt, aber gibt es keine Möglichkeit, Befehle über denselben Abschnitt in diese interaktive Sitzung einzugeben? Könnten Sie auch eine allgemeinere Antwort geben (nicht spezifisch für Gnuplot)? Vielen Dank!
Mihir Gadgil

Nein, nicht alle Anwendungen verarbeiten Eingaben auf dieselbe Weise. Es gibt keine Möglichkeit, das zu verallgemeinern.
Jos

@MihirGadgil - nicht alle Programme funktionieren gleich ... welche anderen möchten Sie verwenden?
Wilf

@ Jos Oh, ich verstehe, danke! Wilf Ich habe in der Vergangenheit Linux verwendet, aber nicht ausgiebig, jetzt versuche ich mehr zu lernen. Ich habe keine solchen Programme im Sinn; Ich versuche nur, so viel wie möglich aus diesem einen Problem zu lernen.
Mihir Gadgil

0

Die hier erwähnte doc-Methode ist sowohl bei Gnuplot als auch bei vielen anderen Programmen sehr nützlich. Durch die Verwendung von Shell-Variablen in den Gnuplot-Befehlen im Here-Doc können Sie Ihre Plots mit Eingaben über die Befehlszeile Ihres Shell-Skripts parametrisieren. Indem Sie die Dinge cagily einrichten, können Sie Plots aus riesigen Mengen von "Big Data" in Massenproduktion erstellen. Ich habe in genau dieser Strukturdynamik-Finite-Analyse-Läufe mit genau dieser Methode konsistent aussehende Streudiagramme mit 20.000 bis 80.000 Punkten pro Diagramm erstellt. Es ist eine sehr mächtige Methode.


1
Können Sie zur Vervollständigung Ihrer Antwort ein Beispiel für die Verwendung der hier genannten doc-Methode hinzufügen?
Melebius

0

Dies könnte helfen

{#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"

Klicken Sie hier für weitere Details

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.