为什么在bash脚本中嵌入repo命令?
我在研究一个Android项目的代码库。
它是这样开始的:
#!/bin/sh
magic='--calling-python-from-/bin/sh--'
"""exec" python -E "$0" "$@" """#$magic"
如果我理解得没错,这段代码的意思是这个脚本在用Python调用自己。
所以我就想问,为什么不直接用Python呢?
比如我通常会用类似这样的方式:
#!/usr/bin/env python
我觉得这里面一定有值得的原因,但我搞不明白。
谢谢!
3 个回答
0
Perl和Ruby都有一个叫做'-x'的命令行选项,这个选项的作用是可以在启动解释器之前,先设置一些像是环境变量这样的东西。简单来说,就是可以在同一个文件里同时写一些shell命令和perl/ruby代码:
#!/bin/sh
export PERL5LIB=/some/perl/lib/path:$PERL5LIB
export FOO=1
exec perl -x $0 $@
# ^^^^ ---- shell commands above this line ---- ^^^^
#!perl
# vvvv ---- perl script below this line ---- vvvv
use strict;
print "Hello world\n":
在这个代码库里提到的“魔法”部分是作者为这个问题提供的解决方案,但这个方案不够灵活,而且有点难懂。遗憾的是,Python目前还没有这个功能。
3
谷歌的开发者肖恩·皮尔斯在这个讨论中解释了原因:
我们需要使用 -E 这个标志,但在某些平台上,env 并没有接受这个标志。所以我想出了一个解决办法。这主要跟我们在谷歌的内部桌面环境有关;那里有很多 PYTHON 的环境变量,我们不想在 repo 处理过程中继承这些变量(因为这些是为了普通谷歌工程师设置的,而不是安卓谷歌工程师)。而且至少在那个时候,Mac OS 或 Linux 上的 env(我记不清是哪一个)拒绝了以 "#!/usr/bin/env python -E" 开头的脚本。
4
来自repo团队的回答:将Repo的Python代码嵌入到bash脚本中的目的