可以通过#将脚本用作解释器! hashbang线?

时间:2011-07-09 19:55:57

标签: bash unix scripting sysadmin

我正在尝试编写一个bash脚本,它将作为一个基本的解释器,但它似乎不起作用:自定义解释器似乎没有被调用。我做错了什么?

这是一个简单的设置来说明问题:

/bin/interpreter:[由root拥有;可执行]

#!/bin/bash

echo "I am an interpreter running " $1

/Users/zeph/script归我所有,可执行:

#!/bin/interpreter

Here are some commands for the custom interpreter.

根据我对hashbangs机制的理解,脚本应该可执行如下:

$ ./script
I am an interpreter running ./script

但这不起作用。而是发生以下情况:

$ ./script 
./script: line 3: Here: command not found

...似乎/bin/bash正试图解释./script的内容。我做错了什么?

注意:虽然/bin/interpreter似乎从未调用过,但如果 不存在,我 会收到错误:

$ ./script
-bash: ./script: /bin/interpreter: bad interpreter: No such file or directory

(第二个注释:如果它有任何区别,我在MacOS X上这样做。)

4 个答案:

答案 0 :(得分:9)

为了完成这项工作,您可以将解释器的解释器(即bash)添加到shebang:

#!/bin/bash /bin/interpreter

Here are some commands for the custom interpreter.
然后

bash将按照预期在$1中使用脚本路径运行您的解释器。

答案 1 :(得分:6)

您不能将脚本直接用作#!解释器,但您可以使用以下命令通过env命令间接运行脚本:

    #!/usr/bin/env /bin/interpreter

/usr/bin/env本身就是二进制文件,因此是#!的有效解释器;并且/bin/interpreter可以是你喜欢的任何东西(任何种类或二进制的脚本),而不必将自己的解释器的知识放入调用脚本中。

答案 2 :(得分:4)

阅读系统的execve手册页。它规定了如何启动脚本,并且应该指定hash-bang行中的解释器是二进制可执行文件。

答案 3 :(得分:0)

我问a similar question in comp.unix.shell提出了一些相关信息。

a second branch of the same thread进一步推动了这个想法。

最常见的unix解决方案是将shebang指向二进制可执行文件。但是,该可执行程序可以像对execl()的单个调用一样简单。这两个线程都导致了一个名为gscmd的程序的示例C源代码,它只不过是execv("gs",...)的包装器。