考虑以下代码:
#!/usr/bin/env python
import sys
print "Hello! I've got %r as input." % sys.stdin.read()
Run Code Online (Sandbox Code Playgroud)
这是chmod +xed脚本/usr/local/bin/my_interpreter.还有这个:
#!/usr/local/bin/my_interpreter
This is intended to be passed "as is" to python script.
Run Code Online (Sandbox Code Playgroud)
是chmod +x试图利用它的ed脚本.如果我echo something | /usr/local/bin/my_interpreter,它工作正常,但一旦我尝试执行上面的脚本,它失败了
/Users/modchan/test_interpreter/foo.bar: line 3: This: command not found
Run Code Online (Sandbox Code Playgroud)
似乎foo.bar是静默地重定向到bash而不是我的脚本.我究竟做错了什么?如何使这项工作?
ham*_*ene 13
看起来Mac OS X要求解释器是二进制的,而不是另一个脚本.要使其工作,请将第二个脚本的解释器更改为
#!/usr/bin/env /usr/local/bin/my_interpreter
Run Code Online (Sandbox Code Playgroud)
但是你在这里遇到了第二个问题:第二个脚本的内容不会转到stdin它的解释器,但脚本路径名将作为命令行参数传递,即
/usr/bin/env /usr/local/bin/my_interpreter /Users/modchan/test_interpreter/foo.bar
Run Code Online (Sandbox Code Playgroud)
您应该按名称sys.argv[1]而不是从中读取文件sys.stdin.
这取决于您正在运行的操作系统的程序加载器,我从您的标签中将其视为 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
Run Code Online (Sandbox Code Playgroud)
另一种方式是这样的:
$!/usr/bin/env /usr/local/bin/my_interpreter
... content to be executed ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3993 次 |
| 最近记录: |