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

Tom*_*ees 10 unix sysadmin bash scripting

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

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

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

#!/bin/bash

echo "I am an interpreter running " $1
Run Code Online (Sandbox Code Playgroud)

/Users/zeph/script 由我拥有,并且可执行:

#!/bin/interpreter

Here are some commands for the custom interpreter.
Run Code Online (Sandbox Code Playgroud)

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

$ ./script
I am an interpreter running ./script
Run Code Online (Sandbox Code Playgroud)

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

$ ./script 
./script: line 3: Here: command not found
Run Code Online (Sandbox Code Playgroud)

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

注意:虽然看起来/bin/interpreter从未调用过,如果它不存在,我收到错误:

$ ./script
-bash: ./script: /bin/interpreter: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*tin 9

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

#!/bin/bash /bin/interpreter

Here are some commands for the custom interpreter.
Run Code Online (Sandbox Code Playgroud)

bash然后$1将按预期使用脚本路径运行解释器.

  • `/ bin/bash`和`/ usr/bin/env`都作为解释器的二进制启动器.谢谢! (2认同)

Mat*_*ery 6

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

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

/usr/bin/env本身是一个二进制文件,因此是一个有效的解释器#!; 并且/bin/interpreter可以是您喜欢的任何内容(任何类型的脚本或二进制文件),而无需将自己的解释器的知识放入调用脚本中.