Ký tự ống trong bash không tạo ra bất cứ thứ gì sau đó kết nối luồng đầu ra của lệnh đầu tiên với luồng đầu vào của dòng thứ hai. echo "123" | cat
về cơ bản giống như cat < <(echo 123)
(sau này chỉ bắt đầu một vỏ cây mặc dù lần đầu tiên bắt đầu một cái cho mỗi lệnh, nhưng điều này có thể bị bỏ qua ở đây - cộng thêm, đó là bashism và không hoạt động trong sh
).
$ mkfifo foo
$ cat foo
Thực sự chặn - nhưng không bị đóng băng. Thời điểm bất kỳ chương trình nào khác ghi bất cứ điều gì vào foo
, mèo sẽ hiển thị nó.
những gì bạn đang doign trong cuộc gọi netcat của bạn được về cơ bản tạo ra một cicrle: bất cứ điều gì được viết vào FIFO sẽ được hiển thị bằng cat
, và, như cat
được kết nối với sh
gửi đến sau này. sh
sau đó sẽ thực thi mã (vì sh chỉ thực hiện bất kỳ điều gì được ghi vào luồng đầu vào của nó) và gửi đầu ra đến nc
. nc
sẽ gửi cho khách hàng. Mọi thứ mà khách hàng gửi đến nc
sẽ được ghi vào FIFO - và vòng kết nối của chúng tôi đã hoàn tất.
Sai lầm bạn đã thực hiện (tôi nghĩ) là giả định quy trình thứ hai của một đường ống chỉ đọc dữ liệu một lần, không liên tục và do đó phải chờ quá trình đầu tiên kết thúc. Điều này là không đúng, bởi vì mọi quá trình trong một đường ống được bắt đầu trong một shubshell, do đó, tất cả họ chạy độc lập của nhau.
Bạn cũng có thể thay đổi thứ tự của tất cả các lệnh trong đường ống. Miễn là người đầu tiên đọc từ FIFO và người cuối cùng viết cho nó (để hoàn thành vòng tròn), nó sẽ hoạt động.
Nguồn
2014-09-08 23:19:42
Ngắn gọn và câu trả lời hay. Cảm ơn! –