2017-11-24 2 views
2

Ich möchte ein Perl-Skript, um eine einfache gnuplot Grafik anzuzeigen. Ich möchte keine Daten in einer Datei speichern, ich möchte ein gnuplot verwenden Einzeiler wie:So rufen Sie einen Gnuplot-Einzeiler von Perl mit system() auf?

gnuplot -p <(echo -e 'plot "-"\n1 1\n2 3\n3 1.7\n4.5 5\ne') 

, dass die Punkte zeigt (1, 1), (2, 3), (3 , 1.7) und (4.5, 5).

In einem Perl-Skript, habe ich versucht, Dinge wie

$plotString = "\"<(echo -e 'plot \\\"-\\\"\\n"; 
$plotString .= "1 1\\n2 3\\n3 1.7\\n4.5 5\\ne')\""; 
system('gnuplot -p ' . $plotString); 

aber ich bekomme die folgende Fehlermeldung:

-e plot "-" 
^ 
"<(echo -e 'plot "-"\n1 1\n2 3\n3 1.7\n4.5 5\ne')", line 1: invalid command 

Dieser Fehler mir überrascht, da die Zeichenfolge zu system() geben, wie in dem Fehler zitiert Nachricht, ist offensichtlich richtig.

Irgendeine Idee, wie man $plotString so ändert, system() würde den gnuplot Befehl richtig interpretieren?

Nebenfrage: Wie zeichnet man das Diagramm with lines? (Ich konnte den Gnuplot-Einzeiler nicht erreichen, auch außerhalb von Perl.)

Edit: Mein OS ist Ubuntu 16.04.

+0

Willkommen bei [zitiert Hölle] (http://wiki.tcl.tk/1726). Auf den ersten Blick sieht es so aus, als hätten Sie einen zusätzlichen Satz von Anführungszeichen um die Variable herum. Aber Sie haben Dinge in so viele Schichten von Zitaten eingepackt, dass es schwer zu sagen ist. Ich schlage vor, eine einfachere Saite zu versuchen und sich dann sanft darauf aufzubauen. Es ist sehr wahrscheinlich, dass es ein einfacher Fluchtfehler ist. –

Antwort

5
system($shell_cmd) 

ist die Abkürzung für

system('/bin/sh', '-c', $shell_cmd) 

Aber was Sie haben, gibt es keine gültige sh Befehl, sondern ein bash Befehl. Das bedeutet, dass Sie stattdessen bash aufrufen müssen.

my $cmd = q{gnuplot -p <(echo -e 'plot "-"\\n1 1\\n2 3\\n3 1.7\\n4.5 5\\ne')}; 
system('bash', '-c', $cmd) 

Es scheint, Sie auch die folgenden zu vermeiden, die Schaffung von zwei Schalen verwenden:

my $program = <<'__EOS__'; 
plot "-" 
1 1 
2 3 
3 1.7 
4.5 5 
e 
__EOS__ 

open(my $pipe, '|-', "gnuplot", "-p") 
print($pipe $program); 
close($pipe); 
+1

Irgendeine Idee, warum 'System ('bash', '-c', $ cmd)' arbeitet, während 'System ('/ bin/sh', '-c', $ cmd)' nicht? Ich meine, sowohl "bash -c" als auch "sh -c" lesen Befehle vom folgenden Befehlszeichenfolgenoperanden. – Georg

+0

Wie ich bereits erklärt habe, liegt das daran, dass '$ cmd' keinen gültigen' sh' Befehl enthält. '<(...)' ist eine 'bash' Funktion. – ikegami

+0

Ich sehe, vielen Dank! – Georg

Verwandte Themen