在基于 Ubuntu 的发行版中通过 gnuplot 脚本对 bash 进行系统调用

在基于 Ubuntu 的发行版中通过 gnuplot 脚本对 bash 进行系统调用

我的问题是:如何更改 gnuplot 的默认 shell?我想更改它以便将 stdout 发送到 bash。

这应该很容易,但我放弃了。原因如下。

我在 Lubuntu 13.10 上运行 gnuplot ver. 4.6 patchlevel 3。

我的默认交互式 shell 是 bash (Bourne-again shell),而 Lubuntu 的登录 shell 似乎是 dash (Debian Almquist shell)。这没问题。

但是 gnuplot 也使用 dash 而不是 bash。这是我询问 gnuplot 时得到的结果:

gnuplot> system "echo $0"
sh

然后,当我问我的 shell 时:

$ which sh
/bin/sh
$ ls -goh /bin/sh
lrwxrwxrwx 1 root root 4 Dec 23 09:30 /bin/sh -> dash

问题的背景:我正在生成几个 epslatex 图,我需要更改每个图的 includegraphics 路径。

这应该不是问题,sed 和循环可以解决这个问题,但使用 gnuplot 的系统调用命令调用 sed 或 bash 脚本对我来说不起作用。最后一个文件的最后三行总是缺失。但是,从纯 bash 运行相同的程序可以完成相当干净的工作。

我也尝试了相反的方法,从 bash 脚本调用 gnuplot,在 gnuplot 脚本中包含打印命令,并尝试将 gnuplot 的 std 输出捕获到 bash 变量中,但也没有成功。例如,尝试从 bash 执行以下行,将消息返回到 std 输出,但不会将内容存储到变量中。

var=$(gnuplot plot.gnu)

我不知道这是 Lubuntu 的问题还是 gnuplot 的问题。我已经用变通方法解决了 tex 文件问题,但 gnuplot 的 shell 问题仍然困扰着我。

所以我一般性地问:我如何更改 gnuplot 的默认 shell?可能吗?也许对其他人有用。;)

编辑于 2016-08-03

最初的问题是关于如何使用系统调用(使用命令system)从 gnuplot 运行 bash 命令和脚本。然而,我针对这个问题提出的解决方案是将发行版的原始系统 shell dash 更改为我所知道的 shell bash。

将系统 shell 更改为 bash 可能会影响系统的整体性能。

答案1

我发现的最佳解决方案是将 bash 配置为整个系统(Ubuntu)的默认 shell。

sudo dpkg-reconfigure dash

此行打开一个 ncurses 助手,询问是否让 dash 成为默认系统 shell。

如果有人回答,则 bash 被设置为默认系统 shell。

此后,我的 gnuplot 脚本运行完美。

编辑于 2016-08-03

请注意,此解决方案正在更改 Linux 发行版的默认 shell,并且可能会影响系统的整体性能。

答案2

我认为这个旧线程的最佳解决方案是显式调用 bash。但是,这需要(可怕的)引用:

gnuplot> !bash -c "echo -e 1{1,2,3}"

或者,作为绘图数据,

plot "< bash -c \"tail -q -n +2 /usr/vera/exos_log/regulate_gspr.log.old.{3,2,1} | grep '^20..-'\"" using 0:2 with lines

我选择的示例利用了 bash 的高级功能,并且不能与 dash 一起使用。

相关内容