Nhiều ống unix không hoạt động


7

Đường ống đầu tiên này hoạt động tốt (in "c"):

echo "a" | sed 's/a/b/' | sed 's/b/c/'

Điều này không làm những gì tôi mong đợi (không có gì được in khi tôi đưa "a" vào fifo của tôi):

mkfifo fifo;
cat fifo | sed 's/a/b/' | sed 's/b/c/' 

Tuy nhiên, nếu tôi loại bỏ lệnh "sed" thứ hai khỏi đường ống sau, tôi sẽ nhận được "b" được in. Tôi nghĩ rằng sự hiểu biết của tôi về đường ống và chuyển hướng phải quá đơn giản. Ai đó có thể giải thích cho tôi cách khắc phục trường hợp thứ 2 để tôi có thể chạy hai lệnh liên tiếp trên nội dung của fifo không?

(lưu ý đây không phải là vấn đề cụ thể đối với fifo, hành vi tương tự cũng xảy ra với netcat. Tôi đã đăng một câu hỏi tương tự về netcat nhưng không có câu trả lời)


2
Mã của bạn làm việc cho tôi. Có lẽ, bạn có thể đánh vần chi tiết hơn về cách bạn "đưa một 'a'" vào fifo của mình.
John1024

Như @ John1024 đã nói, WorksForMe .
Bob

Tôi cũng vậy, không có vấn đề gì.
MariusMatutiae

echo "a" >fifo
Sridhar Sarnobat

Có vẻ như đây là bộ đệm liên quan. Phiên bản nào của sed bạn đang sử dụng? Của tôi làGNU sed version 4.2.1
Sridhar Sarnobat

Câu trả lời:


8

Sử dụng tùy chọn -u( --unbuffered) của sed, để nó ghi đầu ra của nó, thay vì thu thập nó trước để viết nhanh, lớn sau.

cat fifo | sed -u 's/a/b/' | sed -u 's/b/c/'

cat luôn luôn không có bộ đệm.

Nếu không phải là về sed, nhưng một số chương trình có bộ đệm đầu ra, nhưng không có tùy chọn để vô hiệu hóa nó, có những công cụ có thể giúp buộc tắt bộ đệm - xem man unbufferman stdbuf.

Nếu đó là tập lệnh shell, nó sẽ không được xử lý theo mặc định: khi một lệnh tạo đầu ra trong tập lệnh và thoát ra, đầu ra bị xóa. Nếu không, bạn sử dụng unbuffer bên trong tập lệnh shell.

Đối với nền, xem tổng quan này của bộ đệm stdio .


Giả sử thay vì sed, tôi đã có kịch bản tùy chỉnh của riêng mình. Tôi sẽ làm gì trong trường hợp này để tránh đệm? Hoặc nó nên được bỏ mặc định?
Sridhar Sarnobat

Chỉ cần theo dõi thêm - nếu tôi muốn sử dụng biểu thức chính quy perl với bộ đệm, nó sẽ hoạt động giống nhưnc -k -l 4458 | perl -ne 's{HTTP}{FTP}g; $|++;print $_' | perl -ne 's{FTP}{RTSP}g; $|++;print $_'
Sridhar Sarnobat

Vâng, ý bạn là gì? Có một vấn đề, hoặc nó là một ví dụ? Ồ, và bạn có thể sử dụng ssed -Rnếu bạn thích sedvới biểu thức chính quy perl.
Volker Siegel

Xin lỗi, đó không phải là một câu hỏi. Tôi xin lỗi vì đã không rõ ràng, đó chỉ là một ví dụ khác của cùng một khái niệm. Thật không may, đã quá muộn để tôi chỉnh sửa nhận xét đó. Tôi không biết sed có thể hiểu Perl regex. Có lẽ tôi nên bắt đầu sử dụng nó thay vì từ bây giờ.
Sridhar Sarnobat

Ồ không sao!
Volker Siegel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.