151 votes

Comment passer un argument de ligne de commande à gnuplot ?

Je veux utiliser gnuplot pour dessiner des figures à partir d'un fichier de données, par exemple foo.data . Actuellement, j'ai codé en dur le nom du fichier de données dans le fichier de commande, par exemple foo.plt et lancez la commande gnuplot foo.plg pour tracer les données. Cependant, je veux passer le nom du fichier de données comme argument de commande, par exemple en exécutant la commande gnuplot foo.plg foo.data . Comment analyser les arguments de la ligne de commande dans le fichier gnuplot script ? Merci.

200voto

Jari Laamanen Points 931

Vous pouvez entrer des variables via le commutateur -e

$ gnuplot -e "filename='foo.data'" foo.plg

Dans foo.plg vous pouvez alors utiliser cette variable

$ cat foo.plg 
plot filename
pause -1

Pour rendre "foo.plg" un peu plus générique, utilisez un conditionnel :

if (!exists("filename")) filename='default.dat'
plot filename
pause -1

Notez que -e doit précéder le nom du fichier, sinon le fichier s'exécute avant la fonction -e déclarations. En particulier, l'exécution d'un gnuplot shebang #!/usr/bin/env gnuplot avec ./foo.plg -e ... Les arguments CLI ne tiendront pas compte des arguments fournis.

20 votes

Cela peut également être utilisé avec if pour fournir des valeurs par défaut. if ! exists("filename") filename='default.data'

10 votes

Pour les personnes qui tombent sur ce sujet maintenant, le commentaire de mgilson et le patchlevel 3 de Gnuplot 4.6 requièrent if (!exists("filename") au lieu de if ! exists("filename") .

0 votes

Comment faire la même chose sous Windows ?

28voto

Thor Points 13562

Vous pouvez également transmettre des informations par le biais de l'environnement, comme cela est suggéré. ici . L'exemple de Ismail Amin est répétée ici :

Dans la coquille :

export name=plot_data_file

Dans un script de Gnuplot :

#! /usr/bin/gnuplot

name=system("echo $name")
set title name
plot name using ($16 * 8):20 with linespoints notitle
pause -1

6 votes

Au lieu d'exporter, vous pouvez taper name=plot_data_file ./the_gnuplot_script .

0 votes

@Edgar Bonet : Quelle version de gnuplot est nécessaire pour cela ? Cela ne semble pas fonctionner sur ma machine qui utilise la 4.2...

0 votes

Bonjour @Bjoern ! J'utilise Gnuplot 4.6, mais ce n'est pas une fonctionnalité de Gnuplot, c'est une fonctionnalité du shell : name=value command indique au shell d'exécuter la commande avec cette variable particulière dans son environnement. J'utilise bash 4.3.11, mais je pense qu'il s'agit d'une fonction shell très courante.

23voto

Mo3bius Points 75

La réponse de Jari Laamanen est la meilleure solution. Je veux juste expliquer comment utiliser plus d'un paramètre d'entrée avec des variables shell :

output=test1.png
data=foo.data
gnuplot -e "datafile='${data}'; outputname='${output}'" foo.plg

et foo.plg :

set terminal png
set outputname 
f(x) = sin(x)
plot datafile

Comme vous pouvez le voir, les paramètres sont passés avec des points-virgules (comme dans les scripts bash), mais les variables de type chaîne doivent être encapsulées avec ' ' (syntaxe gnuplot, PAS syntaxe Bash).

1 votes

Pour gnuplot lui-même, il importe peu que vous utilisiez ' ou " pour les chaînes de caractères. Les guillemets extérieurs autour des -e L'argument doit être " pour que les variables bash soient substituées. Ce qui suit fonctionne également très bien : OUTPUT=foobar; gnuplot -e "output=\"$OUTPUT\"; print output"

0 votes

Merci de confirmer que je peux utiliser les points-virgules pour séparer les commandes. Aucune des autres réponses ne le montre.

14voto

arto Points 41

Vous pouvez utiliser cette astuce dans un environnement unix/linux :

  1. dans le programme gnuplot : plot "/dev/stdin" ...

  2. En ligne de commande : gnuplot program.plot < data.dat

5voto

Stefan Points 31

Vous pourriez même faire un peu de magie shell, par exemple comme ceci :

#!/bin/bash
inputfile="${1}" #you could even do some getopt magic here...

################################################################################
## generate a gnuplotscript, strip off bash header
gnuplotscript=$(mktemp /tmp/gnuplot_cmd_$(basename "${0}").XXXXXX.gnuplot)

firstline=$(grep -m 1 -n "^#!/usr/bin/gnuplot" "${0}")
firstline=${firstline%%:*} #remove everything after the colon
sed -e "1,${firstline}d" < "${0}" > "${gnuplotscript}"

################################################################################
## run gnuplot
/usr/bin/gnuplot -e "inputfile=\"${inputfile}\"" "${gnuplotscript}"
status=$?
if [[ ${status} -ne 0 ]] ; then
  echo "ERROR: gnuplot returned with exit status $?"
fi

################################################################################
## cleanup and exit
rm -f "${gnuplotscript}"
exit ${status}

#!/usr/bin/gnuplot
plot inputfile using 1:4 with linespoints
#... or whatever you want

Mon implémentation est un peu plus complexe (par exemple, je remplace certains tokens magiques dans l'appel sed, tant que j'y suis déjà...), mais j'ai simplifié cet exemple pour une meilleure compréhension. Vous pourriez aussi le rendre encore plus simple..... YMMV.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X