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.
Đó 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