我正在调查repo(来自Android项目)的源代码。 它从以下开始:
#!/bin/sh
magic='--calling-python-from-/bin/sh--'
"""exec" python -E "$0" "$@" """#$magic"
如果我理解得很好,就意味着脚本正在用python回忆自己。 所以有我的问题,为什么不直接使用python。
例如我通常使用类似的东西:
#!/usr/bin/env python
我认为有一个很有价值的理由,但我无法弄明白。
由于
答案 0 :(得分:4)
答案 1 :(得分:3)
Google开发人员Shawn Pearce在this discussion中说明了原因:
我们需要传递-E标志,但某些平台上的env没有采用 它。所以我把这项工作搞定了。它主要与我们有关 Google的内部桌面;他们有很多PYTHON环境 我们不想继承到repo进程的标志(因为 它们适用于普通的Google工程师,而非Android Google 工程师),至少在Mac OS或Linux上的时候(我 不记得是什么)拒绝了一个“#!/ usr / bin / env”的shbang系列 python -E“。
答案 2 :(得分:0)
Perl和Ruby有一个'-x'命令行开关,用于在启动interpeter之前设置shell环境变量 - 在同一个文件中混合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中缺少的功能。