2015-06-08 14 views
7

Sto cercando di eseguire qualche pezzo di codice Python in uno script bash così ho voluto capire che cosa è la migliore tra:python -c vs ​​Python - << heredoc

#!/bin/bash 
#your bash code 

python -c " 
#your py code 
" 

VS

python - <<DOC 
#your py code 
DOC 

Ho controllato il web ma non sono riuscito a compilare i bit attorno all'argomento. Pensi che uno sia migliore dell'altro? Se si desidera restituire un valore dal blocco di codice Python allo script di bash, heredoc è il solo modo?

Grazie

+2

Nel primo esempio, è necessario sfuggire alle virgolette se si desidera utilizzare stringhe con doppi apici. – Evert

+0

Ok Evert, questo è un aspetto. Quali sono gli altri preferire uno rispetto all'altro? – Kashif

+0

Questa è davvero una domanda su here docs e non su Python – shadowtalker

risposta

6

Il difetto principale di utilizzare un documento di qui è che lo standard input dello script sarà il documento qui. Quindi se hai uno script che vuole elaborare il suo input standard, python -c è praticamente l'unica opzione.

D'altra parte, l'utilizzo di python -c '...' lega la citazione singola per le esigenze della shell, quindi è possibile utilizzare solo stringhe tra virgolette nel proprio script Python; usare le doppie virgolette invece per proteggere lo script dalla shell introduce problemi aggiuntivi (le stringhe nelle virgolette subiscono varie sostituzioni, mentre le stringhe racchiuse tra virgolette sono letterali nella shell).

Come nota a parte, si noti che probabilmente si desidera quotare il delimitatore qui-doc, altrimenti lo script Python è soggetto a sostituzioni simili.

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

Non capisco il tuo commento sulla restituzione di un valore nella shell. Entrambi i costrutti vengono stampati sullo standard output e restituiscono un codice di uscita, entrambi possono essere esaminati dalla shell, se lo si desidera. – tripleee

+0

concordato. Devi leggere shell per l'output che python ha stampato sullo standard output. per esempio. #!/Bin/bash funzione current_datetime { python - << '__ COB' import datetime stampa datetime.datetime.now() __COB }! DTM = $ (current_datetime) eco La data e tempo: $ dtm – Kashif

3

Se si preferisce utilizzare python -c '...' senza dover fuggire con i doppi apici è possibile innanzitutto caricare il codice in una variabile bash usando qui-documenti:

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

Il codice python è caricato Verbatim nella variabile CMD e non è necessario sfuggire alle virgolette doppie.