Démarrer une session interactive dans gnuplot et exécuter certaines commandes à l'ouverture


2

Quand j'exécute mon script, il devrait

  1. Ouvrir un terminal avec gnuplot (session interactive)
  2. Exécutez des commandes gnuplot.
  3. La session interactive reste ouverte. (l'utilisateur peut exécuter des commandes)

J'ai essayé le -edrapeau qui exécute le code, mais le terminal se ferme et n'est pas interactif.

Le -pdrapeau laisse survivre la fenêtre d’intrigue, ce qui est inférieur à ce dont j’ai besoin.

J'ai également essayé de charger un script gnuplot dans l' -eoption -flag, en espérant que cela ouvrirait une session interactive, mais sans succès.


Ma solution actuelle consiste à envoyer des frappes au clavier xte, ce qui fonctionne, mais est un peu hacky. Y a-t-il de meilleures solutions?

Réponses:


1
gnuplot -e "print 'here I am'" -

devrait marcher


0

Le script suivant fera ce que vous demandez tel que je le comprends. Il exécutera une séquence de commandes gnuplot de manière non interactive, puis poursuivra la même session gnuplot à partir de la ligne de commande. Les commentaires dans le script indiquent où vous devez placer les commandes non interactives.

#!/bin/bash - 

# Cheap 'trick' to show gnuplot prompt
# There are better ways
prmpt () { (echo -n "gnuplot> " >&2) }

# Function that serves as a pipe to gnuplot; 
# non-interactively then interactively
gnuplotInPipe () {
  # simple example from http://gnuplot.sourceforge.net/demo/simple.html
  # All non interactive stuff goes here:
  echo "set title \"Simple Plots\" font \",20\""
  echo "set key left box"
  echo "set samples 50"
  echo "set style data points"
  echo "plot [-10:10] sin(x),atan(x),cos(atan(x))"
  # end of non-interactive gnuplot commands
  (echo "Type 'quit' to exit" >&2)
  prmpt 
  # Here we read in lines (terminated with newline)
  # and pipe them directly to the same gnuplot
  # session
  while true; do
    read -er cmd
    if [ "$cmd" == 'quit' ]; then
      break
    fi
    echo "$cmd"
    prmpt 
  done
}

# Call gnuplotInPipe and pipe it's output
# to gnuplot
gnuplotInPipe | gnuplot 

Remarques:

  1. La méthode que j'utilise pour émuler l'invite gnuplot est un piratage rapide qui peut sans aucun doute être amélioré et qui est en réalité complètement inutile.

  2. Si ce n'est pas ce que vous essayez de faire, veuillez fournir les commandes que vous exécutez (avez essayé) depuis le terminal, ainsi qu'un extrait suffisant du script gnuplot que vous appelez.

  3. Pour améliorer ceci, jetez un coup d'œil aux pipes nommés . Si vous souhaitez conserver un script comme celui-ci pour une utilisation à long terme, je choisirais cette voie pour des raisons de maintenabilité. Ce script obtient un résultat très similaire avec plus de méthodes de force 'brute'.

    Par exemple, j'utilise stderr pour des choses qui ne vont pas dans gnuplot pour plus de commodité - l'invite, les informations de commande de sortie. Celles-ci seraient mieux traitées avec un tuyau nommé.


Génial! C'était exactement ce que je voulais, et moins hacky que ce que j'avais.
Gilles Castel

0

Si vous êtes sur un système * nix (j'utilise Linux), tout ressemble à un fichier, ce qui signifie que nous pouvons lire notre session de terminal actuelle, tout comme un fichier normal.

J'ai placé le texte suivant à la fin de mon script gnuplot pour obtenir le nom de mon terminal et le "charge" exactement comme vous le feriez avec un script normal:

set title 'Interactive session'
plot 'mydata.dat'
  
etc
  
tty=system("tty")   # execute the command "tty" in OS and store output
load tty            # load the tty like a file

Vous n'obtenez aucune invite de cette façon, mais cela fonctionne bien pour mes besoins. Vous pouvez continuer à taper dans le terminal; frapper Enter (ou Return, ou quel que soit le nom de votre touche de fin de ligne) enverra la ligne à la session gnuplot.  Ctrl+ Dquittera la session normalement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.