2015-06-08 14 views
7

Tôi cố gắng để chạy một số đoạn mã python trong một kịch bản bash vì vậy tôi muốn hiểu là tốt nhất giữa là gì:python -c vs ​​python - << heredoc

#!/bin/bash 
#your bash code 

python -c " 
#your py code 
" 

VS

python - <<DOC 
#your py code 
DOC 

Tôi đã kiểm tra web nhưng không thể biên dịch các bit xung quanh chủ đề. Bạn có nghĩ rằng cái nào tốt hơn cái kia không? Nếu bạn muốn trả về một giá trị từ khối mã python đến tập lệnh bash của bạn thì heredoc là cách duy nhất?

Cảm ơn

+2

Trong ví dụ đầu tiên, bạn sẽ cần phải thoát khỏi dấu ngoặc kép nếu bạn muốn sử dụng chuỗi với dấu ngoặc kép đôi. – Evert

+0

Ok Evert, đây là một khía cạnh. Những người khác thích cái nào hơn cái kia? – Kashif

+0

Điều này thực sự là một câu hỏi về tài liệu ở đây và không phải về Python – shadowtalker

Trả lời

6

Lỗi chính khi sử dụng tài liệu ở đây là đầu vào tiêu chuẩn của tập lệnh sẽ là tài liệu tại đây. Vì vậy, nếu bạn có một tập lệnh muốn xử lý đầu vào chuẩn, thì python -c là lựa chọn duy nhất của bạn.

Mặt khác, sử dụng python -c '...' liên kết báo giá đơn cho nhu cầu của vỏ, vì vậy bạn chỉ có thể sử dụng chuỗi được trích dẫn kép trong tập lệnh Python của mình; bằng cách sử dụng dấu ngoặc kép thay vì để bảo vệ tập lệnh từ trình bao giới thiệu các vấn đề khác (các chuỗi trong dấu ngoặc kép trải qua các thay thế khác nhau, trong khi các chuỗi được trích dẫn đơn là chữ trong trình bao).

Là một sang một bên, thông báo rằng có thể bạn muốn đơn quote dấu phân cách ở đây-doc, quá, nếu không kịch bản Python là tùy thuộc vào sự thay thế tương tự.

python - <<'____HERE' 
print("""Look, we can have double quotes!""") 
print('And single quotes! And `back ticks`!') 
print("$(and what looks to the shell like process substitutions and $variables!)") 
____HERE 
+0

Tôi không hiểu nhận xét của bạn về trả về giá trị cho trình bao. Cả hai cấu trúc in ra đầu ra tiêu chuẩn và trả về một mã thoát, cả hai cấu trúc đó đều có thể được kiểm tra bởi trình bao nếu bạn muốn. – tripleee

+0

Đồng ý. Bạn cần phải đọc shell cho đầu ra python được in ra đầu ra tiêu chuẩn. ví dụ. #/bin/bash chức năng current_datetime { python - << '__ COB' nhập khẩu datetime in datetime.datetime.now() __COB }! dtm = $ (current_datetime) vang Hôm nay và thời gian: $ dtm – Kashif

3

Nếu bạn thích sử dụng python -c '...' mà không cần phải thoát ra với hai dấu ngoặc kép đầu tiên bạn có thể tải mã trong một biến bash sử dụng ở đây-tài liệu:

read -r -d '' CMD << '--END' 
print ("'quoted'") 
--END 
python -c "$CMD" 

Mã python được nạp đúng nguyên văn vào biến CMD và không cần thoát khỏi dấu nháy kép.