显然这个shell脚本将自己称为Python脚本:
#!/bin/sh
## repo default configuration
##
REPO_URL='git://android.git.kernel.org/tools/repo.git'
REPO_REV='stable'
magic='--calling-python-from-/bin/sh--'
"""exec" python -E "$0" "$@" """#$magic"
if __name__ == '__main__':
import sys
if sys.argv[-1] == '#%s' % magic:
del sys.argv[-1]
del magic
:
:
(整个脚本:https://android.googlesource.com/tools/repo/+/v1.0/repo)
任何人都可以解释
这样称呼的目的是什么?
为什么不在第一行中使用#!/usr/bin/env python
以便解释它
从一开始就是Python脚本?
添加魔术最后一个命令行参数的目的,后来在Python代码的开头删除了吗?
答案 0 :(得分:8)
您的第一个问题:这是为了修复不处理#的unix系统(或其仿真)!正确或根本没有。高级艺术是制作一个在shell和其他语言中都正确的脚本。对于perl,人们经常会看到类似的东西:
exec "/usr/bin/perl"
if 0;
exec由shell解释和执行,但perl解释器看到条件语句(.... if ...)并且什么也不做,因为条件是假的。