2013-07-03 14 views
14

Ben bu soruya cevap birini anlamaya çalışıyorum:Neden 4 tek tırnak içinde bir iş parçacığı #!/Bin/sh ve exec python ile bu snippet çalışır?

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

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

Bu iyi çalışıyor, ama daha ziyade o satırın başında dört kene ile çalışır neden anlamıyorum üçten fazla.

Ayrıca, neden bu dizgenin sonuna yakın bir karma?

'''something''' 

Kabuk destekleyen tek tek tırnakla:

+0

Sadece bu başlatacak unutmayın * o ** korkunç güvensiz ** # 'kıyasla/usr/bin/env -i yüzden $ PATH'' herhangi * piton! python' * veya * (daha da iyisi) tam yolu bilmek ve kullanmak: '#!/usr/bin/python'. –

cevap

25

Python üçlü tırnakla destekler

'something' 

dört tırnak kullanarak, sh gördüğü 2 olarak boş dizeler, ancak Python ilk üçü, üçlü tırnak içine alınmış bir dizgenin başlangıcı olarak görür ve dize değerinin bir parçası olarak dördünü içerir.

Çizginin geri kalanı, sh tarafından bir komut olarak yorumlanır, ancak Python tarafından bir dizenin bir parçası olarak yorumlanır.

# daha sonra sh ile ilgili bir yorum oluşturur, ancak hala bir kapanış üçlü-alıntı ile kapatarak Python'a bir dize.

Yani

Özetlemek gerekirse:

  • sh görür: boş dize ('')-boş dize ('')-komutu (exec python -u -- "$0" ${1+"[email protected]"})-comment (# ''')
  • Python şunları görür: üç tırnak işaretli dize değişmezi ('exec python -u -- "$0" ${1+"[email protected]"} # karakterlerini içerir)

Yani sh komut adı ve komut satırı argümanları geri kalanı ile python -u -- kendini değiştirerek, bu komutu çalıştırır, ve Python bu dosyayı okur ve sadece bu yere gitmiyor değişmez bir ilk dizesi görür.

Dosyadaki ilk dizgi değişkeni olduğu için, __main__ modülünün belgeleyicisi olarak ayarlanacak, ancak bu ana komut dosyasıysa, önemli olmayacak.

+0

$ {1 + "$ @"} 'nedir? $ @ 'dan nasıl farklı? – Dog

+0

@Dog: Bu şu anlama gelir: * eğer * 1 param 1 ayarlanmışsa, "$ @" '(kote edilmiş parametreler) yerine, null değeri verilir. –

+0

Gerçeklerden sonra dokuyu değiştirebilir misiniz, merak ediyorum? – Will

0

Sadece kullanın:

#!/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

Çözümünüzü kabul edilen yanıt üzerinde kullanmanın avantajı nedir? – akhan

+0

Bu, yayınlanan soruyu yanıtlamıyor, ne * kullanmanızın önemi yok, OP, belirli bir kod parçasının nasıl çalıştığını anlamak istiyor. –

İlgili konular