请考虑以下代码:
#!/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而不是我的脚本。我究竟做错了什么?如何使这项工作?
答案 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 ...