2013-07-03 49 views
14

Tôi đang cố gắng để hiểu một trong những câu trả lời cho câu hỏi này:Tại sao đoạn mã này với một shebang #!/Bin/sh và exec python bên trong 4 dấu nháy đơn hoạt động?

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

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

này hoạt động tốt, nhưng tôi không hiểu tại sao nó hoạt động với bốn ve vào đầu dòng đó thay hơn ba.

Ngoài ra, tại sao băm gần cuối chuỗi đó?

+0

Chỉ cần lưu ý rằng điều này sẽ khởi động * bất kỳ * python trong '$ PATH' vì vậy nó ** khủng khiếp không an toàn ** so với' #/usr/bin/env -i! python' * hoặc * (thậm chí tốt hơn) biết và sử dụng đường dẫn đầy đủ: '#!/usr/bin/python'. –

Trả lời

25

Python hỗ trợ triple-trích dẫn chuỗi:

'''something''' 

Shell chỉ hỗ trợ duy nhất được trích dẫn chuỗi:

'something' 

Bằng cách sử dụng Bốn dấu ngoặc kép, sh thấy rằng như 2 chuỗi rỗng, nhưng Python xem ba đầu tiên là bắt đầu của chuỗi được trích dẫn ba lần và bao gồm chuỗi thứ tư là một phần của giá trị chuỗi.

Phần còn lại của dòng sau đó được hiểu là lệnh bằng sh, nhưng là một phần của chuỗi bằng Python.

# sau đó tạo thành nhận xét theo như sh là có liên quan, nhưng nó vẫn là một chuỗi để Python, đóng nó bằng dấu ba chấm đóng.

Vì vậy, để tóm tắt:

  • sh thấy: chuỗi rỗng ('')-chuỗi rỗng ('')-lệnh (exec python -u -- "$0" ${1+"[email protected]"})-bình luận (# ''')
  • Python thấy: chuỗi được trích dẫn ba chữ (chứa các ký tự 'exec python -u -- "$0" ${1+"[email protected]"} #)

Vì vậy sh thực thi lệnh đó, thay thế bản thân với python -u -- với tên kịch bản và phần còn lại của các đối số dòng lệnh, và Python đọc tập tin này và chỉ thấy một chuỗi ban đầu đen mà không được đi đâu cả.

Vì đây là chuỗi đầu tiên trong tệp, nó sẽ được đặt làm chuỗi tài liệu cho mô-đun __main__ nhưng điều đó hầu như không quan trọng nếu đây là tập lệnh chính.

+0

'$ {1 +" $ @ "}' là gì? nó khác với '$ @' như thế nào? – Dog

+0

@Dog: Điều đó có nghĩa là: * nếu * param 1 được đặt, thay thế '" $ @ "' (tham số được trích dẫn) khác thay thế null. –

+0

Bạn có thể sửa đổi chuỗi tài liệu sau sự thật không? – Will

0

tôi chỉ sử dụng:

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

Lợi thế của việc sử dụng giải pháp của bạn trên câu trả lời được chấp nhận là gì? – akhan

+0

Điều này không trả lời câu hỏi được đăng, không quan trọng bạn sử dụng * gì, OP muốn hiểu cách một đoạn mã cụ thể hoạt động. –