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

标签 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 代码的开头被删除了?

最佳答案

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

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

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

关于android - 为什么这个 shell 脚本将自己称为 python 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5565340/

相关文章:

java - 如何使用 Java 文件中的 R.Color 在 Android Studio 中更改操作栏 setBackgrounddrawable 颜色?

java - 如何在android中制作 "Never Ending Service"?我正在使用小米和vivo,在这些设备中服务被杀死,同时从最近的服务中删除它?

android - 通过 Android isoDep.transceive 成功 'Unknown' 后,Google 钱包状态为 'Compute Crytographic Checksum'

python - 在 Python 中创建信息图

python - 给定一张图片,尽你所能准确地创建情节

bash - 将命令的输出分配给变量

android: Project.Properties - 不要编辑,你的更改会被删除吗?

python - 如果大于某个阈值,则将灰度图像中的像素着色为红色

bash - 在shell脚本中查找shell可执行文件目录的平台独立方式是什么?

linux - shell 脚本 - 二级脚本的输入参数