【问题标题】:Alternate Interpreters for Script脚本的替代解释器
【发布时间】:2013-02-20 11:04:06
【问题描述】:

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

#!/usr/bin/gnuplot -p

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

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

#!gnuplot -p

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

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

【问题讨论】:

    标签: bash gnuplot hashbang


    【解决方案1】:

    #!/usr/bin/env gnuplot 使它更像portable

    【讨论】:

    • Wrikken,这很好用!但是...我实际上打电话给gnuplot -p,但为了简化问题,我删除了该标志。当我尝试#!/usr/bin/env gnuplot -p 时,它告诉我没有这样的文件或目录。有没有解决的办法?我正在使用 Linux。
    • 我阅读了邮件列表here,发现有一些正当的理由说明我对/usr/bin/env#! 的期望过高。不过,如果它有效,那就太好了。
    • 不在shebang AFAIK中,但我想你可以创建一个.gnuplot文件来设置默认终端和它的持久性。
    【解决方案2】:

    显而易见的解决方案是

    #!/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
    

    【讨论】:

    • 感谢基思的全面回答。我选择在我的脚本中使用命令set term x11 persist,这缓解了需要-p 参数的问题。
    【解决方案3】:

    #!/usr/bin/env gnuplot 是一种更便携的解释器表达方式,如 herehere 所述。

    但是,这会带来一个您可能没有预料到的问题。

    #!/usr/bin/gnuplot -p
    

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

    #!/usr/bin/env gnuplot -p
    

    这似乎是显而易见的便携式替代方案行不通。

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

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

    #!/usr/bin/env gnuplot
    

    然后包含该行

    set term x11 persist
    

    在你的 GNUplot 脚本中,它会做同样的事情。

    【讨论】:

    • 将参数传递给 gnuplot-c 可调用标志怎么样?
    • 我刚刚发现 OSXenv 支持参数...不过,Debian 不支持...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多