2012-03-05 39 views
6

Tôi thề tôi đã thấy điều này trước khi thực hiện nhưng không thể tìm thấy ngay bây giờ. Có thể có một kịch bản shell bắt đầu một con trăn interpeter "giữa dòng", ví dụ:Tập lệnh shell và python hỗn hợp có thể?

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

Trả lời

8

Bạn có thể sử dụng cú pháp vỏ này (nó được gọi là đây tài liệu trong văn học Unix):

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

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

Điểm đánh dấu sau '< <' nhà điều hành có thể bởi một số nhận dạng tùy ý, mọi người thường sử dụng một cái gì đó như EOF (kết thúc tệp) hoặc EOD (cuối tài liệu). Nếu điểm đánh dấu bắt đầu một dòng thì trình bao sẽ diễn giải nó như là kết thúc của đầu vào cho chương trình.

2

Bạn có thể viết

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

import sys 

print ("xyzzy") 

sys.exit(0) 
END_OF_PYTHON 

để thay thế cho quá trình Bash với Python và vượt qua các chương trình cụ thể để Python trên đầu vào tiêu chuẩn của nó. (Các exec thay thế quá trình Bash Các <<END_OF_PYTHON nguyên nhân tiêu chuẩn đầu vào để chứa tất cả mọi thứ cho đến END_OF_PYTHON..)

+0

+1: khi thực thi vượt trội so với chỉ cần gọi python. Con quái vật là không cần thiết trong bối cảnh này, và sẽ được đối xử đơn thuần như một bình luận. –

+0

@WilliamPursell: Bạn biết đấy, tôi thậm chí còn không chú ý đến shebang. . . không chỉ là không cần thiết, nhưng nó thực sự gây hiểu lầm, vì điều này sẽ không gọi 'env'. Tôi cho rằng lệnh này có thể là 'exec env python << END_OF_PYTHON', nhưng có lẽ tốt hơn là chỉ cần loại bỏ shebang. – ruakh

0

Dĩ nhiên ngay sau khi tôi đăng này tôi nhớ một cách để làm điều đó:

#!/bin/sh 

echo Shell 

python <<EOF 

import sys 

print "Python" 

sys.exit(0) 

EOF 
2

Nếu python của bạn kịch bản rất ngắn. Bạn có thể vượt qua nó như là một chuỗi để python sử dụng -c tùy chọn:

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

Hoặc

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

Tôi đồng ý rằng trộn/nghiền lên có thể là một kỹ thuật khá mạnh mẽ - không chỉ ở kịch bản mà còn ở dòng lệnh (ví dụ như inliners perl đã được chứng minh là rất thành công theo thời gian). Vì vậy, mũi nhỏ của tôi trên một biến thể của một lớp lót (ngoài được đề cập bởi kev) cho tập lệnh hỗn hợp trong bash/python:

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

sản xuất

x 
y 
z 
0

Đó là tuyệt vời cho kịch bản nội tuyến ngắn/mã. Nếu người ta có thể dựa vào kịch bản bash như keo phù hợp để viết một ứng dụng lớn, tốt, người ta có thể có các thành viên khác nhau viết mã/kịch bản bằng bất kỳ ngôn ngữ nào họ giỏi và sau đó người ta có thể kết hợp công việc của họ như sau. Tất nhiên, người ta cũng phải giả định rằng rất nhiều thời gian hoạt động khác nhau là ok cho một ứng dụng. @ 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 
Các vấn đề liên quan