【问题标题】:Shebang pointing to script (also having shebang) is effectively ignored指向脚本的 Shebang(也有 shebang)被有效地忽略了
【发布时间】:2012-04-03 06:24:55
【问题描述】:

考虑以下代码:

#!/usr/bin/env python

import sys

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

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

#!/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,它可以正常工作,但是一旦我尝试执行上面的脚本,它就会失败

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

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

【问题讨论】:

  • @moodywoody,恕我直言,问题不一样,但您链接的问题信息量很大。
  • 我不想说这个问题是重复的——只是另一个线程提供了丰富的信息。

标签: macos bash shell


【解决方案1】:

看起来 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 读取文件。

【讨论】:

  • 谢谢,在你回答之前我已经尝试过使用/usr/bin/env my_interpreter,但不知道文件名转到 argv 而不是 stdin。
【解决方案2】:

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

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

Linux 从 2.6.27.9 开始就支持这一点,但本文的作者认为可能没有任何源自伯克利的 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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-20
    • 2012-04-14
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多