Come eseguire i comandi in gnuplot usando lo script della shell?


10

Quello che voglio fare è scrivere uno script che prima avvia un programma e poi gli dice di eseguire un gruppo di comandi e poi uscire. Facciamo un esempio.

Ho scritto questo script myscript.she non funziona nel modo in cui lo voglio. Ciò che fa è semplicemente eseguire gnuplot e attendere che si chiuda, quindi esegue gli altri comandi; che ovviamente produce errori.

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

Immagino sia chiaro cosa sto cercando di fare; in caso contrario, fammi sapere nei commenti.

Risposte:


12

Da man gnuploto la sua manpage online :

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

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

Quindi quello che probabilmente vuoi eseguire è il seguente comando:

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

Altre varianti che ho proposto ma che non sono così utili sono state:

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

I primi 2 producono esattamente l'output desiderato. Anche se -pnon è di grande utilità in questo esempio; se premi invio nel terminale, gnuplot esce e la finestra del diagramma diventa completamente non interattiva, ad eccezione del comando quit. L'output del 3 ° va e viene (per niente visibile). L'ultimo produce output, ma poiché gnuplot si chiude immediatamente, la finestra del diagramma è di nuovo non interattiva (inoltre, mostra un piccolo diagramma di 1 quadrato di 1 cm). Quindi pause -1è necessario.
Mihir Gadgil,

@MihirGadgil Grazie per il feedback. Modificato la mia risposta.
Byte Commander

16

Un modo è con -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

un altro modo, se è necessario preelaborare i dati, è con un Bash Here Document(vedi 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
Questo (il metodo della shell "here-doc") è probabilmente la risposta generica che l'OP ha cercato. expect
Funzionerà

Inoltre è possibile rendere eseguibile gli script con chmod u+x myscript.gnued eseguire direttamente con ./myscript.gnu Solo una nota si dimentica la []nel yrange: set yrange [$minval:$maxval].
Hastur,

3

Come spiegato nelle manpagine , si gnuplotaspetta l'input da un file di comando in quella che viene chiamata sessione batch . Ad esempio, è possibile scrivere la riga plot sin(x)su un file myplote quindi eseguirla gnuplot myplot.

Se si omette il file di comando, come fa lo script, si otterrà una sessione interattiva .


Okay, ho capito che sta saltando in una sessione interattiva, ma non c'è modo di alimentare i comandi in quella sessione interattiva attraverso lo stesso script? Inoltre, potresti dare una risposta più generale (non specifica per gnuplot)? Grazie!
Mihir Gadgil,

No, non tutte le applicazioni elaborano l'input allo stesso modo. Non c'è modo di generalizzare questo.
Jos

@MihirGadgil - non tutti i programmi funzionano allo stesso modo ... quali altri vuoi usare?
Wilf,

@Jos Oh, capisco, grazie! Wilf Ho usato Linux in passato ma non ampiamente, ora sto cercando di saperne di più. Non ho in mente programmi simili; sto solo cercando di imparare il più possibile da questo problema.
Mihir Gadgil,

0

Il metodo here-doc menzionato è molto utile con Gnuplot e anche con molti altri programmi. Usando le variabili di shell all'interno dei comandi Gnuplot nel here-doc, puoi parametrizzare i tuoi grafici con input dalla riga di comando del tuo script di shell. Configurando in modo intelligente le cose, puoi produrre in serie trame da vaste scoperte di "big data". Ero solito produrre grafici a dispersione dall'aspetto coerente con 20.000 a 80.000 punti PER TRAMA in centinaia di analisi finite di dinamica strutturale usando esattamente questo metodo. È un metodo molto potente.


1
Per rendere completa la tua risposta, potresti aggiungere un esempio su come utilizzare il metodo menzionato qui-doc?
Melebio

0

Questo potrebbe aiutare

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

Clicca qui per maggiori dettagli

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.