¿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.