gnuplot: Können Sie Shell-Variablen in einem Skript festlegen und später aufrufen?

Sep 10 2020

Ich möchte in der Lage sein, Shell-Befehle über ein Gnuplot-Skript auszugeben, z. B. das Festlegen einer Variablen, aber es scheint, dass der systemBefehl eine neue Shell-Instanz erzeugt, anstatt Befehle an die Shell-Instanz zu senden, auf der das Gnuplot-Skript ausgeführt wird. Siehe das folgende Skript, in dem die erste Zeile die Zuweisung von zulässt $foo, die zweite Zeile jedoch nicht auf diese Variable zugreifen kann. In diesem Fall $foowird als beliebige Zeichenfolge im Gegensatz zu einem Verweis auf das Verzeichnis zugewiesen, daher die\"

#!/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

Antworten

3 Quasímodo Sep 09 2020 at 23:47

Sie haben Recht: Jeder systemBefehl gibt eine brandneue Shell aus, sodass die mit festgelegte Variable system "foo=bar"weg ist, wenn Gnuplot in die folgende Zeile wechselt.

Ein sehr praktischer Ansatz in Ihrem Fall ist die Verwendung von Here-Docs .

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

Einige Anmerkungen zum Skript:

  • sed "5p" filebedeutet, dass alle Zeilen der Datei gezeichnet werden, die fünfte Zeile jedoch dupliziert wird. Wenn Sie nur die 5. Zeile zeichnen wollten, verwenden Siesed -n "5p" file

  • Dies ruft Gnuplot auf, ist aber immer noch ein Shell-Skript. Daher ist es besser, immer Variablen (z. B. "$foo") in Anführungszeichen zu setzen, um eine Wortteilung zu verhindern.