【发布时间】:2017-06-18 23:26:10
【问题描述】:
通过所谓的 shebang 线将脚本绑定到特定的解释器是 POSIX 操作系统上众所周知的做法。例如,如果执行以下脚本(给定足够的文件系统权限),操作系统将启动 /bin/sh 解释器,并将脚本的文件名作为其第一个参数。随后,shell 将执行脚本中的命令,跳过将被视为注释的 shebang 行。
#! /bin/sh
date -R
echo hello world
可能的输出:
Sat, 01 Apr 2017 12:34:56 +0100
hello world
我曾经相信解释器(在本例中为/bin/sh)必须是本机可执行文件,并且不能是脚本本身,而这反过来又需要又一个口译员即将推出。
不过,我还是继续尝试了以下实验。
使用下面保存为/tmp/interpreter.py的哑shell,...
#! /usr/bin/python3
import sys
import subprocess
for script in sys.argv[1:]:
with open(script) as istr:
status = any(
map(
subprocess.call,
map(
str.split,
filter(
lambda s : s and not s.startswith('#'),
map(str.strip, istr)
)
)
)
)
if status:
sys.exit(status)
…并将以下脚本另存为/tmp/script.xyz,
#! /tmp/interpreter.py
date -R
echo hello world
...我能够(在使两个文件都可执行后)执行script.xyz。
这让我很惊讶。我什至可以通过另一个脚本启动scrip.xyz。
所以,我要问的是:
- 我的实验观察到的行为是否可移植?
- 实验是否正确进行,或者是否存在这种情况不起作用?不同的(类 Unix)操作系统怎么样?
- 如果这个 应该工作,那么就调用而言,本机可执行文件和解释脚本之间确实没有明显的区别吗?
【问题讨论】:
标签: linux shell unix posix executable