gnuplot: Pouvez-vous définir des variables shell dans un script et les appeler plus tard?

Sep 10 2020

Je veux pouvoir émettre des commandes shell à partir d'un script gnuplot, comme la définition d'une variable, mais il semble que la systemcommande génère une nouvelle instance de shell au lieu d'émettre des commandes à l'instance de shell qui exécute le script gnuplot. Voir le script suivant où la première ligne permet l'affectation de $foo, mais la deuxième ligne ne peut pas accéder à cette variable. Dans ce cas, $fooest assigné comme une chaîne arbitraire par opposition à une référence au répertoire, d'où le\"

#!/usr/bin/gnuplot -p
system "export foo=\"$HOME/path/to/dir\";echo $foo"
system "echo $foo" set datafile separator "\t" #plot "`echo $foo`/bar.dat" using 2:3
plot "<( sed '5p' $foo/bar.dat )" using 2:3

Réponses

3 Quasímodo Sep 09 2020 at 23:47

Vous avez raison: chaque systemcommande émet un tout nouveau shell, donc la variable définie avec system "foo=bar"disparaît lorsque Gnuplot passe à la ligne suivante.

Une approche très pratique dans votre cas consiste à utiliser here-docs .

foo="$HOME/path/to/dir" gnuplot -p<<EOF set datafile separator "\t" plot '<(sed "5p" "$foo"/bar.dat)'
EOF

Quelques notes sur le script:

  • sed "5p" filesignifie que toutes les lignes du fichier seront tracées, mais que la 5ème ligne sera dupliquée. Si vous vouliez tracer uniquement la 5e ligne, utilisezsed -n "5p" file

  • Cela appelle Gnuplot mais reste un script shell, il est donc préférable de toujours citer des variables (telles que "$foo") pour éviter le fractionnement de mots.