Obviously this shell script is calling itself as a 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ドル" "$@" """#$magic"
if __name__ == '__main__':
import sys
if sys.argv[-1] == '#%s' % magic:
del sys.argv[-1]
del magic
:
:
(Whole script: https://android.googlesource.com/tools/repo/+/v1.0/repo)
Can anyone explain
the purpose of calling it this way?
Why not having#!/usr/bin/env pythonin the first line so it gets interpreted as Python script from the beginning?the purpose of adding that magic last command line argument, that is removed afterwards in the beginning of the Python code?
-
1Smells like bureaucracy to me.wlangstroth– wlangstroth2011年04月06日 11:14:51 +00:00Commented Apr 6, 2011 at 11:14
-
@Will: Do you mean the author had some non-technical constraint that allows only shell scripts, no Python scripts; so he wrote a Python script that is formally a shell script?Curd– Curd2011年04月08日 12:53:34 +00:00Commented Apr 8, 2011 at 12:53
-
I guess I have to work on my dry sense of humour. Ingo's answer is the most likely real reason.wlangstroth– wlangstroth2011年04月08日 13:13:57 +00:00Commented Apr 8, 2011 at 13:13
1 Answer 1
Your first question: this is done to fix unix systems (or emulations thereof) that do not handle the #! correctly or at all. The high art is to make a script that is correct in shell as well as in the other language. For perl, one often sees something like:
exec "/usr/bin/perl"
if 0;
The exec is interpreted and executed by the shell, but the perl interpreter sees a conditional statement (.... if ...) and does nothing because the condition is false.
2 Comments
sh to interpret scripts in a particular directory./usr/bin/env.