bash - 如何使用 system() 从 Perl 调用 gnuplot one-liner?

标签 bash perl gnuplot sh

我想要一个 Perl 脚本来显示一个简单的 gnuplot 图表。我不想在文件中存储任何数据,我想使用 gnuplot 单行代码,例如:

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

显示点 (1, 1)、(2, 3)、(3, 1.7) 和 (4.5, 5)。

在 Perl 脚本中,我尝试了类似的事情

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

但我收到以下错误:

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

这个错误让我感到惊讶,因为字符串传递给 system()错误消息中引用的 显然是正确的。

知道如何修改$plotString所以system()能正确解释 gnuplot 命令吗?

第二个问题:如何绘制图表with lines ? (即使在 Perl 之外,我也无法使用 gnuplot 单行代码来完成此操作。)

编辑:我的操作系统是 Ubuntu 16.04。

最佳答案

system($shell_cmd)

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

但是您所拥有的不是有效的 sh 命令,而是 bash 命令。这意味着您需要调用 bash

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

看来您还可以使用以下方法来避免创建两个 shell:

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);

关于bash - 如何使用 system() 从 Perl 调用 gnuplot one-liner?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47465627/

相关文章:

gnuplot x 标签在直方图中的位置

linux - Shell脚本中Diff的解析结果

linux - 在 Awk split(for 循环)中运行 Sed 命令

bash - 正确使用 $@

perl - 使用 Test::Mojo 测试 URL 生成

Perl Dancer2 默认路由失败

perl - Emacs Perl 模式 : Send script/buffer to Perl interpreter?

linux - Shell - 将环境变量与 ccrypt 一起使用

python - 如何在 gnuplot-py 中设置图形标题的字体大小?

C++ 和 gnuplot