2012-02-28 11 views
2

引用:Googleアンドロイドのレポファイルはどのように機能しますか? <a href="https://dl-ssl.google.com/dl/googlesource/git-repo/repo" rel="nofollow">the script</a>の

!/bin/sh                  

## repo default configuration 
## 
REPO_URL='https://android.googlesource.com/tools/repo' 
REPO_REV='stable' 
... 
magic='--calling-python-from-/bin/sh--' 
"""exec" python -E "$0" "[email protected]" """#$magic" 
if __name__ == '__main__': 
    import sys 
    if sys.argv[-1] == '#%s' % magic: 
    del sys.argv[-1] 
del magic 
..all python from here on.. 

がどのように彼らは、単一のスクリプトではbashやPythonを入れて、それを実行することができますか?

答えて

3

これは私がそれを理解する方法です: スクリプトは最初のシェルスクリプトとして呼び出された後、ライン23上のpythonを呼び出して、あなたがレポでsyncコマンドを起動した場合、それは次の操作を行いますされています

"""exec" python -E "$0" "[email protected]" """#$magic" 

私はが exec "python -E" repo "" sync "# - calling-python-from-/bin/sh--に変わると信じています。 これはスクリプトrepoをpythonスクリプトとして呼び出します。すべての構文がbashとpythonの中でexecの行に合法であることに気がつくでしょう.23行目の3重引用符はreaですlly sweet、彼らはシェルスクリプトで動作し、Pythonでドキュメント文字列として動作します。どのくらい素晴らしいです!

python """複数の行にまたがることができるドキュメントストリング。非常に大まかに言うと、pythonヘルプシステムが読むことができる非常に特殊なコメントです。 bashでは、私はのように、二重引用符がインタプリタが出会う次の二重引用符と一致すると信じています。したがって最初の2つの引用符はヌル文字列を引用し、それはインタープリタから消えます。この例では、次の引用符はexecというキーワードを引用しています。最後の三重引用符のセット"""#$magic"は、最初にヌル文字列を引用してから、#$magic引数を引用します。二重引用符は変数$magicを展開することができるため、#--calling-python-from-/bin/sh--となり、引数として渡されます。

シンタックスハイライトをシェルスクリプトとして、次にPythonスクリプトとしてテキストエディタで表示すると、さらに見やすくなります。これは、シェルスクリプトを起動してから、Pythonを制御するという非常に巧妙な方法です。お役に立てれば!

+0

bashとpythonの両方で三重引用符がどのように機能するか詳しく説明できますか? –

+0

"" "は、Pythonで複数行の引用符を開始します。これは、" ""の次の箇所に続きます。 Bashでは、次の二重引用符まで続く別の二重引用符で囲まれた文字列に隣接した二重引用符(二重引用符の空の文字列)の空のペアです。さて、Pythonでは、文字列は単に無視される定数ですが、Bashではコマンドを二重引用符で囲むことができます。 "" exec "は引用符を取り除いた後に' exec'コマンドを評価します。 – tripleee

関連する問題

 関連する問題