Подтвердить что ты не робот

Почему эта оболочка script вызывает себя как python script?

Очевидно, что эта оболочка script вызывает себя как Python script:

#!/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" "[email protected]" """#$magic"
if __name__ == '__main__':
  import sys
  if sys.argv[-1] == '#%s' % magic:
    del sys.argv[-1]
del magic
:
:

(Целый script: https://android.googlesource.com/tools/repo/+/v1.0/repo)

Может кто-нибудь объяснить

  • цель назвать его таким образом?
    Почему бы не иметь #!/usr/bin/env python в первой строке, чтобы он интерпретировался как Python script с самого начала?

  • цель добавления последнего аргумента командной строки магии, который впоследствии удаляется в начале кода Python?

4b9b3361

Ответ 1

Ваш первый вопрос: это делается для исправления систем unix (или их эмуляции), которые не обрабатывают #! правильно или вообще. Высокое искусство заключается в том, чтобы сделать script правильным как в оболочке, так и на другом языке. Для perl часто видят что-то вроде:

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

exec интерпретируется и выполняется оболочкой, но интерпретатор perl видит условный оператор (.... if...) и ничего не делает, поскольку условие является ложным.