为什么在bash脚本中嵌入repo命令?

6 投票
3 回答
575 浏览
提问于 2025-04-16 12:55

我在研究一个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" 开头的脚本。

撰写回答