Thấy "vỡ ống" trong tình huống này là hiếm, nhưng bình thường.
Khi bạn chạy type rvm | head -1
, bash thực thi type rvm
trong một quy trình, head -1
trong một quy trình khác. 1 Thiết bị xuất chuẩn type
được kết nối với đầu "ghi" của ống , stdin của head
đầu "đọc". Cả hai quá trình chạy cùng một lúc.
Các head -1
quá trình đọc dữ liệu từ thiết bị nhập chuẩn (thường là trong khối 8 kB), in ra một dòng đơn (theo -1
lựa chọn), và lối thoát hiểm, gây ra "đọc" cuối đường ống để được đóng lại. Vì rvm
hàm này khá dài (khoảng 11 kB sau khi được phân tích cú pháp và được xây dựng lại bằng bash), điều này có nghĩa là head
thoát ra trong khi type
vẫn còn một vài kB dữ liệu để ghi ra.
Tại thời điểm này, vì type
đang cố ghi vào một đường ống mà đầu kia đã bị đóng - một đường ống bị hỏng - hàm write () mà nó đã điều chỉnh sẽ trả về lỗi EPIPE, được dịch là "Đường ống bị hỏng". Ngoài lỗi này, kernel cũng gửi tín hiệu SIGPIPE tới type
, theo mặc định sẽ giết quá trình ngay lập tức.
(Tín hiệu này rất hữu ích trong các vỏ tương tác, vì hầu hết người dùng không muốn quá trình đầu tiên tiếp tục chạy và cố gắng ghi vào nơi nào. Trong khi đó, các dịch vụ không tương tác bỏ qua SIGPIPE - sẽ không tốt cho daemon chạy dài chết vì một lỗi đơn giản như vậy - vì vậy họ thấy mã lỗi rất hữu ích.)
Tuy nhiên, việc truyền tín hiệu không phải là 100% ngay lập tức và có thể có trường hợp write () trả về EPIPE và quá trình tiếp tục chạy trong một thời gian ngắn trước khi nhận được tín hiệu. Trong trường hợp này, type
có đủ thời gian để thông báo ghi thất bại, dịch mã lỗi và thậm chí in thông báo lỗi sang thiết bị lỗi trước khi bị SIGPIPE giết. (Thông báo lỗi cho biết "-bash: type:" vì đây type
là lệnh tích hợp sẵn của bash.)
Điều này dường như phổ biến hơn trên các hệ thống nhiều CPU, vì type
quy trình và mã phân phối tín hiệu của kernel có thể chạy trên các lõi khác nhau, theo nghĩa đen cùng một lúc.
Có thể xóa thông báo này bằng cách vá type
nội dung (trong mã nguồn của bash) để thoát ngay lập tức khi nhận được EPIPE từ hàm write ().
Tuy nhiên, không có gì phải lo lắng và nó không liên quan đến rvm
cài đặt của bạn dưới bất kỳ hình thức nào.