¿Cómo ejecutar comandos en gnuplot usando shell script?


10

Lo que quiero hacer es escribir un script que primero inicie un programa y luego le diga que ejecute un montón de comandos y luego salga. Vayamos con un ejemplo.

Escribí este script myscript.shy no funciona como yo quiero. Lo que hace es ejecutar gnuplot y esperar a que se cierre y luego ejecuta los otros comandos; que obviamente produce errores.

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

Supongo que está claro lo que estoy tratando de hacer; si no, házmelo saber en los comentarios.

Respuestas:


12

Desde man gnuploto su página de manual en línea :

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

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

Entonces, lo que probablemente quiera ejecutar es el siguiente comando:

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

Otras variantes que propuse pero que no son tan útiles fueron:

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

Los primeros 2 producen exactamente la salida deseada. Aunque -pno es de mucha utilidad en este ejemplo; Si presiona Intro en la terminal, gnuplot sale y la ventana de trazado se vuelve completamente no interactiva, excepto por el comando salir. La salida de la tercera simplemente va y viene (no visible en absoluto). El último produce resultados, pero dado que gnuplot se cierra inmediatamente, la ventana de trazado vuelve a ser no interactiva (además, muestra un pequeño trazado de 1 cm cuadrado). Entonces pause -1es necesario.
Mihir Gadgil

@MihirGadgil Gracias por los comentarios. Edité mi respuesta.
Byte Commander

16

Una forma es 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

Otra forma, si necesita preprocesar datos, es con un Bash Here Document(ver 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
Este (el método de shell "here-doc") es probablemente la respuesta genérica que buscaba el OP. Funcionará para muchos programas basados ​​en comandos (y si no, puede escalar a expect...
Rmano

Por otra parte usted puede hacer ejecutable con los scripts chmod u+x myscript.gnuy ejecutar directamente con ./myscript.gnu sólo una nota olvida el []en el yrange: set yrange [$minval:$maxval].
Hastur

3

Como se explica en las manpáginas , gnuplotespera la entrada de un archivo de comando en lo que se llama una sesión por lotes . Por ejemplo, puede escribir la línea plot sin(x)en un archivo myploty luego ejecutarla gnuplot myplot.

Si omite el archivo de comando, como lo hace su script, obtendrá una sesión interactiva .


De acuerdo, entiendo que está saltando a una sesión interactiva, pero ¿no hay forma de alimentar comandos en esa sesión interactiva a través del mismo sctipt? Además, ¿podría dar una respuesta más general (no específica de gnuplot)? ¡Gracias!
Mihir Gadgil

No, no todas las aplicaciones procesan la entrada de la misma manera. No hay forma de generalizar eso.
Jos

@MihirGadgil: no todos los programas funcionan de la misma manera ... ¿cuáles quieres usar?
Wilf

@Jos Oh, ya veo, gracias! Wilf He usado Linux en el pasado pero no extensamente, ahora estoy tratando de aprender más. No tengo ninguno de esos programas en mente; solo trato de aprender todo lo que pueda de este problema.
Mihir Gadgil

0

El método here-doc mencionado es muy útil con Gnuplot y con muchos otros programas también. Mediante el uso de variables de shell dentro de los comandos de Gnuplot en here-doc, puede parametrizar sus gráficos con entradas de la línea de comandos de su script de shell. Al configurar las cosas con cautela, puede producir en masa parcelas a partir de vastos tesoros de "big data". Solía ​​producir diagramas de dispersión de aspecto consistente con 20,000 a 80,000 puntos POR PARCELA en cientos de análisis de finitos de dinámica estructural utilizando exactamente este método. Es un método muy poderoso.


1
Para completar su respuesta, ¿podría agregar un ejemplo de cómo usar el método here-doc mencionado?
Melebius

0

Esto puede ayudar

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

haga clic aquí para más detalles

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.