脚本的替代解释器

时间:2013-03-05 21:04:56

标签: bash gnuplot hashbang

我有一个脚本,我在两台计算机上运行。代码的第一行如下所示:

#!/usr/bin/gnuplot -p

在第二台计算机上,我想使用存储在$HOME/bin/gnuplot的GNUplot版本。

$HOME/bin包含在第二台计算机的$PATH变量中,因此我尝试使用对GNUplot的泛型调用来启动脚本:

#!gnuplot -p

但这不起作用,因为该脚本随后搜索了./gnuplot

有没有办法让两台计算机的标题行相同?我希望解决方案以某种方式包含在那一行中,而不需要脚本来区分计算机或让我告诉它它在哪台计算机上。

3 个答案:

答案 0 :(得分:1)

#!/usr/bin/env gnuplot使其更加portable

答案 1 :(得分:1)

正如herehere所述,

#!/usr/bin/env gnuplot是表达口译员的一种更便携的方式。

然而,这引入了一个你可能没想到的问题。

#!/usr/bin/gnuplot -p

创建一个持久的GNUplot窗口,但正在运行

#!/usr/bin/env gnuplot -p

这似乎是明显的便携式替代方案无效。

讨论了here的一些原因,但似乎没有办法解决它:争论和/usr/bin/env并没有真正相处。

-p标志的特定情况下,最好使用

#!/usr/bin/env gnuplot

然后包含

set term x11 persist

在您的GNUplot脚本中,它将执行相同的操作。

答案 2 :(得分:0)

显而易见的解决方案是

#!/usr/bin/env gnuplot

请参阅this questionmy answer,了解此方法的优缺点。

但在您的情况下,您需要将-p参数传递给gnuplot - 并且#!行不会处理该语法。你可以使用

#!/usr/bin/gnuplot -p

但如果你尝试:

#!/usr/bin/env gnuplot -p

它可能会尝试执行名为gnuplot -p的内容,这当然不存在(它将"gnuplot -p"作为单个参数传递给/usr/bin/env)。

我使用的解决方案是编写一个安装脚本,修改每个系统的#!行。弄清楚如何做到这一点留下来作为练习。

如果您的主目录在两台计算机上具有相同的完整路径名,则可以执行以下操作:

#!/home/yourname/bin/gnuplot -p

gnuplot所在的$HOME/bin所在的计算机上,这正是您想要的。另一方面,如果您要使用/usr/bin/gnuplot,请创建$HOME/bin/gnuplot作为/usr/bin/gnuplot的符号链接:

ln -s /usr/bin/gnuplot ~/bin/gnuplot

如果您不想在两台计算机上弄乱$HOME/bin目录,或者$HOME具有不同的完整路径名,请选择其他目录。例如,您可以在两台计算机上的/tmp/yourname/bin中安装它:

mkdir -p /tmp/yourname/bin
ln -s /usr/bin/gnuplot /tmp/yourname/bin/gnuplot # on one machine, OR
ln -s ~/bin/gnuplot /tmp/yourname/bin/gnuplot    # on the other

并使用:

#!/tmp/yourname/bin/gnuplot -p