我的问题是:如何更改 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 一起使用。