首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向脚本的Shebang (也有shebang)实际上被忽略了

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

Stack Overflow用户
提问于 2012-04-03 14:24:55
回答 2查看 4.6K关注 0票数 23

考虑以下代码:

代码语言:javascript
复制
#!/usr/bin/env python

import sys

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

这是/usr/local/bin/my_interpreter中的chmod +xed脚本。还有这个:

代码语言:javascript
复制
#!/usr/local/bin/my_interpreter

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

是试图使用它的chmod +xed脚本。如果我使用echo something | /usr/local/bin/my_interpreter,它工作得很好,但是一旦我尝试执行上面的脚本,它就失败了

代码语言:javascript
复制
/Users/modchan/test_interpreter/foo.bar: line 3: This: command not found

似乎foo.bar被静默地重定向到bash,而不是我的脚本。我做错了什么?如何做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 14:48:03

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

代码语言:javascript
复制
#!/usr/bin/env /usr/local/bin/my_interpreter

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

代码语言:javascript
复制
/usr/bin/env /usr/local/bin/my_interpreter /Users/modchan/test_interpreter/foo.bar

您应该通过名称sys.argv[1]而不是从sys.stdin读取文件。

票数 19
EN

Stack Overflow用户

发布于 2012-04-03 14:38:42

这取决于您正在运行的操作系统的程序加载程序,我从您的标签中将其视为OS。许多类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

实现你想要的一种方法是这样的:

代码语言:javascript
复制
$!/bin/sh
exec /usr/local/bin/my_interpreter <<EOM

... content to be executed ...
EOM

另一种方法是这样的:

代码语言:javascript
复制
$!/usr/bin/env /usr/local/bin/my_interpreter
... content to be executed ...
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9988125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档