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

tor*_*gen 18 macos bash shell

考虑以下代码:

#!/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.

  • 谢谢,在您回答之前,我已经尝试使用 `/usr/bin/env my_interpreter`,但不知道文件名转到 argv 而不是 stdin。 (2认同)

A B*_*A B 6

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