2014-12-04 16 views
5

Ai đó có thể giải thích tại sao lệnh bash/python ngắn này thường không tạo ra "hello"đọc stdin từ python inlined trong bash

$ echo hello | python - <<END 
import sys 
for line in sys.stdin: 
    print line 
END 

Nếu tôi tiết kiệm script python của tôi vào một tập tin, lệnh này làm việc như mong đợi.

Trong script.py

import sys 
for line in sys.stdin: 
    print line 
END 

$ echo "hello" | python script.py

"hello"

Trả lời

4

python << END chuyển hướng stdin để đọc các chương trình . Bạn cũng không thể đọc được đường ống từ echo trên stdin.

3

Oh boy, điều đó có ý nghĩa! Tôi đã đấu tranh với điều này trong một giờ qua và cuối cùng tôi hiểu, cảm ơn cả hai bạn.

Để cung cấp một lựa chọn làm việc cho chương trình ban đầu, bạn có thể làm một cái gì đó như thế này:

$ echo hello | python <(cat <<END 
import sys 
for line in sys.stdin: 
    print line 
END 
) 

Nhưng hãy cẩn thận! Nếu bạn đặt nó vào một tập tin, số END cuối cùng cần chạm vào máng xối trái (không có khoảng trắng). Nếu không, nó sẽ không phân tích cú pháp với một 'kết thúc bất ngờ của tập tin trong khi tìm kiếm lỗi của nhân vật phù hợp' hoặc một cái gì đó tương tự (thực sự, điều này đã cho tôi thêm hai giờ để tìm ra từ khi tôi bắt đầu trả lời câu hỏi này).

giải mã, những gì đang xảy ra là các <<END ... END kết hợp với <(cat ...) tạo một tập tin (trong /dev/fd) để nó có thể được làm thức ăn cho python, như thể nó là một tập tin thực sự. Trích dẫn this giải thích về <(...):

Đó là quá trình thay thế. Nó cung cấp đầu ra của lệnh vào một FIFO có thể đọc từ một tệp bình thường.

Có một câu trả lời thú vị khác về chủ đề này here.

+0

Đó là một cách sử dụng sáng tạo nhưng vẫn cơ bản [sử dụng vô dụng 'cat'] (http://www.iki.fi/era/unix/award.html). Shell không cần sự trợ giúp của 'cat' trong quá trình thay thế để nạp tài liệu vào Python, mặc dù cấu trúc tránh buộc đầu vào tiêu chuẩn (vỏ cơ bản làm cho đầu ra từ quá trình thay thế có sẵn như một tệp tạm thời được đặt tên) . – tripleee

3

Lý do không hoạt động là bạn có các chuyển hướng xung đột. echo | python cố gắng gắn đầu vào tiêu chuẩn vào đường ống từ echo, trong khi python - <<HERE cố gắng kết nối đầu vào tiêu chuẩn vào tài liệu tại đây. Bạn không thể có cả hai. (Tài liệu ở đây sẽ thắng.)

Tuy nhiên, thực sự không có lý do gì để tự mình đặt văn bản cho đầu vào tiêu chuẩn.

bash$ echo hello | python -c ' 
> import sys 
> for line in sys.stdin: 
> print line' 
hello 
Các vấn đề liên quan