2013-07-03 4 views
14

なぜこのスニペットは#!/ bin/shとexecのpythonを四重引用符で囲んだものですか?私はこの質問への回答のいずれかを理解しようとしている

Cannot pass an argument to python with "#!/usr/bin/env python"

#!/bin/sh 
''''exec python -u -- "$0" ${1+"[email protected]"} # ''' 

これはうまく動作しますが、それはむしろ、その行の先頭に4ティックで動作しますなぜ私は理解していません3つ以上。

さらに、なぜその文字列の最後にハッシュがありますか?

+0

ただ、 'ます。#/ usr/bin/envを-iに比べ**それは**ひどく不安定なですので、これは' $のPATH'で*は任意の*パイソンを起動することに注意してくださいpython' *または*(さらに良い)フルパスを知っていて、それを使用する: '#!/ usr/bin/python'。 –

答えて

25

Pythonはトリプル引用符で囲まれた文字列をサポートしています。shは2つの空の文字列としてことを認識しますが、Pythonの、引用符を使用することにより

'something' 

'''something''' 

シェルは単一引用符で囲まれた文字列をサポートしています最初の3文字は3重引用符で囲まれた文字列の先頭になり、4文字目は文字列値の一部として含まれます。

残りの行は、shによってコマンドとして解釈されますが、Pythonによる文字列の一部として解釈されます。

#は、shまではコメントを作成しますが、まだPythonの文字列であり、閉じた3重引用符で閉じます。

だから、

、要約する:

  • shが見る:空の文字列(''から空の文字列(''からコマンド(exec python -u -- "$0" ${1+"[email protected]"}からコメント(# '''
  • Pythonで表示される文字:二重引用符の文字列リテラル(文字:'exec python -u -- "$0" ${1+"[email protected]"} #

のでshは、スクリプト名とコマンドライン引数の残りの部分とpython -u --で自身を置き換えて、そのコマンドを実行し、Pythonは、このファイルを読み込んで、どこでも行っていないリテラルの初期文字列を見ています。

ファイル内の最初の文字列リテラルなので、__main__モジュールのドキュメントストリングとして設定されますが、これがメインスクリプトの場合はほとんど問題になりません。

+0

'$ {1 +" $ @ "}'とは何ですか? '$ @'とどう違うのですか? – Dog

+0

@Dog:つまり:*もし* param 1が設定されているなら、 '' $ @ "'(引用符で囲まれたパラメータ)に置き換えてください。 –

+0

事実の後にdocstringを修正できますか? – Will

0

私はちょうど使用します!

#!/bin/sh 
''':' 
exec python -tt "$0" "[email protected]" 
''' 
# The above shell shabang trick is more portable than /usr/bin/env and supports adding arguments to the interpreter (python -tt) 
+0

受け入れられた回答よりもあなたのソリューションを使用する利点は何ですか? – akhan

+0

これは投稿された質問には答えません。あなたが使っているものは問題ではありません。OPは特定のコードの仕組みを理解したいと思っています。 –

関連する問題