为什么这个shell脚本将自己称为python脚本?

时间:2011-04-06 11:08:48

标签: android python sh

显然这个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代码的开头删除了吗?

1 个答案:

答案 0 :(得分:8)

您的第一个问题:这是为了修复不处理#的unix系统(或其仿真)!正确或根本没有。高级艺术是制作一个在shell和其他语言中都正确的脚本。对于perl,人们经常会看到类似的东西:

exec "/usr/bin/perl"
   if 0;

exec由shell解释和执行,但perl解释器看到条件语句(.... if ...)并且什么也不做,因为条件是假的。