2012-03-05 17 views
6

Przysięgam, widziałem to już wcześniej, ale nie mogę go teraz znaleźć. Czy to możliwe, aby mieć skrypt powłoki uruchomić Pythona interpeter „połowy strumienia”, to znaczy:Możliwe mieszanie skryptów powłoki i python?

#!/bin/bash 
#shell stuff.. 

set +e 

VAR=aabb 

for i in a b c; do 
    echo $i 
done 

# same file! 

#!/usr/bin/env python 
# python would be given this fd which has been seek'd to this point 

import sys 

print ("xyzzy") 

sys.exit(0) 

Odpowiedz

8

Można użyć tej składni powłoki (nazywa się to tutaj udokumentować w literaturze Unix):

#!/bin/sh 
echo this is a shell script 

python <<@@ 
print 'hello from Python!' 
@@ 

Znacznik po "< <" przez arbitralny identyfikator, ludzie często używają czegoś takiego jak EOF (koniec pliku) lub EOD (koniec dokumentu). Jeśli znacznik rozpoczyna linię, wówczas powłoka interpretuje ją jako koniec wejścia dla programu.

2

można napisać

exec python <<END_OF_PYTHON 
#!/usr/bin/env python 

import sys 

print ("xyzzy") 

sys.exit(0) 
END_OF_PYTHON 

zastąpić proces atakujących z Python i przekazać określony program do Pythona na jego standardowego wejścia. (The exec zastępuje proces Bash <<END_OF_PYTHON przyczyny standardowego wejścia zawiera wszystko, aż do END_OF_PYTHON.).

+0

+1: Wykonywanie jest lepsze niż po prostu wywołanie Pythona. W tym kontekście shebang jest niepotrzebny i będzie traktowany jedynie jako komentarz. –

+0

@WilliamPursell: Wiesz, nawet nie zauważyłem shebangu. . . nie tylko nie jest to konieczne, ale tak naprawdę wprowadza w błąd, ponieważ nie wywoła ono 'env'. Przypuszczam, że komendą może być 'exec env python << END_OF_PYTHON', ale prawdopodobnie lepiej po prostu usunąć shebang. – ruakh

0

Oczywiście zaraz po Zamieściłem to pamiętałem sposób to zrobić:

#!/bin/sh 

echo Shell 

python <<EOF 

import sys 

print "Python" 

sys.exit(0) 

EOF 
2

Jeśli Twój python Skrypt jest bardzo krótki. można przekazać go jako ciąg do python używając opcji -c:

python -c 'import sys; print "xyzzy"; sys.exit(0)' 

Albo

python -c ' 
import sys 
print("xyzzy") 
sys.exit(0) 
' 
0

Zgadzam się, że mieszanie/zacierania się może być bardzo potężna technika - nie tylko w skryptach, ale także w linia poleceń (np. inlinery perl okazały się bardzo skuteczne w czasie). Więc moja mała rada na innym wariancie jednej wkładki (oprócz wspomnianego przez keV) dla mieszanego skryptów w bash/Python:

for VAR in $(echo 'import sys; print "x y z"; sys.exit(0)' | python -);do echo "$VAR"; done; 

produkuje

x 
y 
z 
0

To jest dobre dla krótkiego skryptu inline/kod. Jeśli można polegać na skrypcie basha jako odpowiednim kleju do napisania dużej, dobrej aplikacji, można mieć różnych członków zespołu pisać kod/skrypt w jakimkolwiek języku, w którym są dobrzy, a następnie można po prostu powiązać ich pracę w następujący sposób. Oczywiście należałoby również założyć, że tak wiele różnych runtime jest w porządku dla jednej aplikacji. @ user318904 @phs @piokuc

#!/bin/bash 
java hello 
#hello class bytecode to be in the path 
python hello.py 
elixir simple.exs 
perl hello.pl 
nodejs sum1.js 
coffee sum2.coffee 
#any other bash script can be put anywhere 
Powiązane problemy