Comment exécuter des commandes dans gnuplot en utilisant un script shell?

10

Ce que je veux faire, c'est écrire un script qui lance d'abord un programme, puis lui dit d'exécuter un tas de commandes, puis de quitter. Allons-y avec un exemple.

J'ai écrit ce script myscript.shet il ne fonctionne pas comme je le souhaite. Ce qu'il fait est simplement d'exécuter gnuplot et d'attendre qu'il se ferme, puis d'exécuter les autres commandes; ce qui produit évidemment des erreurs.

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

Je suppose que ce que j'essaie de faire est clair; sinon, faites le moi savoir dans les commentaires.

Mihir Gadgil
la source

Réponses:

12

Depuis man gnuplotou sa page de manuel en ligne :

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

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

Donc, ce que vous voulez probablement exécuter, c'est la commande suivante:

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

D'autres variantes que j'ai proposées mais qui ne sont pas si utiles étaient:

gnuplot -p -e "plot sin(x); pause -1"
gnuplot -e "plot sin(x)"
gnuplot -p -e "plot sin(x)"
Byte Commander
la source
Les 2 premiers produisent exactement la sortie souhaitée. Bien que -pne soit pas très utile dans cet exemple; si vous appuyez sur entrée dans le terminal, gnuplot se ferme et la fenêtre de tracé devient complètement non interactive, à l'exception de la commande quit. La sortie du 3ème vient juste et va (pas visible du tout). Le dernier produit une sortie, mais puisque gnuplot se ferme immédiatement, la fenêtre de traçage est à nouveau non interactive (également, elle montre un minuscule tracé de 1 carré). C'est donc pause -1nécessaire.
Mihir Gadgil
@MihirGadgil Merci pour les commentaires. Modifié ma réponse.
Byte Commander
16

Une façon consiste à -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

une autre façon, si vous avez besoin de prétraiter des données, est avec un Bash Here Document(voir 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
waltinator
la source
1
Ceci (la méthode shell "here-doc") est probablement la réponse générique recherchée par l'OP. Cela fonctionnera pour de nombreux programmes commandés par des commandes (et sinon, vous pouvez passer à expect...
Rmano
En outre , vous pouvez rendre exécutables les scripts avec chmod u+x myscript.gnuet exécuter directement avec ./myscript.gnu Juste un petit mot vous oubliez []dans le yrange: set yrange [$minval:$maxval].
Hastur
3

Comme expliqué dans les manpages , gnuplotattend l'entrée d'un fichier de commandes dans ce qu'on appelle une session batch . Vous pouvez par exemple écrire la ligne plot sin(x)dans un fichier myplotpuis l'exécuter gnuplot myplot.

Si vous omettez le fichier de commandes, comme le fait votre script, vous obtiendrez une session interactive .

Jos
la source
D'accord, je comprends qu'il saute dans une session interactive, mais n'y a-t-il aucun moyen d'alimenter des commandes dans cette session interactive via le même sctipt? Pouvez-vous également donner une réponse plus générale (non spécifique à gnuplot)? Merci!
Mihir Gadgil
Non, toutes les applications ne traitent pas les entrées de la même manière. Il n'y a aucun moyen de généraliser cela.
Jos
@MihirGadgil - tous les programmes ne fonctionnent pas de la même manière ... quels autres voulez-vous utiliser?
Wilf
@Jos Oh, je vois, merci! Wilf J'ai utilisé Linux dans le passé mais pas de manière intensive, essayant maintenant d'en savoir plus. Je n'ai pas de tels programmes en tête; essayant juste d'apprendre autant que je peux de ce seul problème.
Mihir Gadgil
0

La méthode here-doc mentionnée est très utile avec Gnuplot et avec de nombreux autres programmes également. En utilisant des variables shell dans les commandes Gnuplot de la documentation ici, vous pouvez paramétrer vos tracés avec des entrées de la ligne de commande de votre script shell. En configurant mal les choses, vous pouvez produire en masse des tracés à partir de vastes trésors de «big data». J'avais l'habitude de produire des diagrammes de dispersion d'apparence cohérente avec 20 000 à 80 000 points PAR PLOT dans des centaines d'analyses finies de dynamique structurale en utilisant exactement cette méthode. C'est une méthode très puissante.

Charles
la source
1
Pour compléter votre réponse, pourriez-vous ajouter un exemple sur la façon d'utiliser la méthode mentionnée ici-doc?
Melebius
0

Cela pourrait aider

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

Cliquez ici pour plus de détails

lala khan
la source