gnuplot: Können Sie Shell-Variablen in einem Skript festlegen und später aufrufen?
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
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" fileDies 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.