Shebang指向脚本(也有shebang)实际上被忽略了

时间:2012-04-03 06:24:55

标签: macos bash shell

请考虑以下代码:

#!/usr/bin/env python

import sys

print "Hello! I've got %r as input." % sys.stdin.read()

这是chmod +x中的/usr/local/bin/my_interpreter ed脚本。这个:

#!/usr/local/bin/my_interpreter

This is intended to be passed "as is" to python script.

尝试使用它的chmod +x ed脚本。如果我echo something | /usr/local/bin/my_interpreter,它可以正常工作,但是一旦我尝试执行上面的脚本,它就会失败并带有

/Users/modchan/test_interpreter/foo.bar: line 3: This: command not found

似乎foo.bar被静默地重定向到bash而不是我的脚本。我究竟做错了什么?如何使这项工作?

2 个答案:

答案 0 :(得分:13)

看起来Mac OS X要求解释器是二进制文件,而不是另一个脚本。要使其工作,请将第二个脚本的解释器更改为

#!/usr/bin/env /usr/local/bin/my_interpreter

但是你在这里遇到第二个问题:第二个脚本的内容将转到其解释器的stdin,但脚本路径名将作为命令行参数传递,即

/usr/bin/env /usr/local/bin/my_interpreter /Users/modchan/test_interpreter/foo.bar

您应该按名称sys.argv[1]而不是sys.stdin来阅读文件。

答案 1 :(得分:4)

这取决于您正在运行的操作系统的程序加载程序,我从标记中获取OS X.许多类UNIX操作系统要求shebang解释器是一个已编译的可执行二进制文件,而不是另一个与另一个shebang的脚本。

http://en.wikipedia.org/wiki/Shebang_(Unix

Linux自2.6.27.9以来一直支持这一点,但本文作者提出可能没有任何Berkeley派生的Unixen(可能包括OS X):

http://www.in-ulm.de/~mascheck/various/shebang/#interpreter-script

实现目标的一种方法是:

$!/bin/sh
exec /usr/local/bin/my_interpreter <<EOM

... content to be executed ...
EOM

另一种方式是这样的:

$!/usr/bin/env /usr/local/bin/my_interpreter
... content to be executed ...