Pipeline (Unix)![]() Trong các hệ điều hành máy tính giống Unix, một đường ống là một cơ chế để liên lạc giữa các quá trình bằng cách truyền tin nhắn. Một đường ống là một tập hợp các tiến trình được nối với nhau bởi các luồng tiêu chuẩn của chúng, sao cho văn bản đầu ra của mỗi tiến trình (stdout) được truyền trực tiếp dưới dạng đầu vào (stdin) tới tiến trình kế tiếp. Quá trình đầu tiên không được hoàn thành trước khi quá trình thứ hai được bắt đầu, chúng được thực hiện đồng thời. Khái niệm về đường ống được xây dựng bởi Douglas McIlroy trong hệ điều hành Unix của Bell Labs, quá trình phát triển của Unix đã định hình triết lý hộp công cụ của Unix.[1][2] Nó được đặt tên bằng cách tương tự với một đường ống vật lý. Một tính năng chính của các đường ống này là "ẩn nội bộ" của chúng (Ritchie & Thompson, 1974). Điều này tạo nên sự trong suốt hơn và đơn giản hơn trong hệ thống. Bài viết này là về các đường ống ẩn danh, trong đó dữ liệu được viết bởi một tiến trình được đệm bởi hệ điều hành cho đến khi nó được đọc bởi tiến trình tiếp theo và kênh đơn hướng này sẽ biến mất khi các tiến trình được hoàn thành. Điều này khác với các đường ống được đặt tên, trong đó các thông điệp được truyền đến hoặc đi từ một đường ống được đặt tên bằng cách biến nó thành một tệp và vẫn còn sau khi các tiến trình được hoàn thành. Cú pháp shell tiêu chuẩn cho các ống ẩn danh là liệt kê các lệnh, được phân tách bằng các thanh dọc ("ống" trong phiên bản Unix phổ biến): process1 | process2 | process3
Ví dụ: để liệt kê các tệp trong thư mục hiện tại (ls), giữ lại các dòng đầu ra của ls chứa chuỗi "key" (grep) và xem kết quả trong trang cuộn (less), người dùng nhập dòng sau vào terminal : ls -l | grep key | less
" Đường ống trong giao diện dòng lệnhTất cả các shell Unix được sử dụng rộng rãi đều có cấu trúc cú pháp riêng để tạo đường ống. Trong tất cả các cách sử dụng, người ta viết các lệnh theo trình tự, được phân tách bằng ký tự thanh dọc ASCII " Luồng lỗiTheo mặc định, các luồng lỗi tiêu chuẩn (" stderr ") của các tiến trình trong đường ống không được truyền qua đường ống; thay vào đó, chúng được hợp nhất và hướng đến console . Tuy nhiên, nhiều shell có cú pháp bổ sung để thay đổi hành vi này. Ví dụ, trong csh, sử dụng " PipemillTrong các đường ống đơn giản được sử dụng phổ biến nhất, shell kết nối một loạt các tiến trình thông qua các đường ống và thực hiện các lệnh bên ngoài trong mỗi tiến trình. Do đó, bản thân shell không thực hiện xử lý trực tiếp dữ liệu chảy qua đường ống.
Tuy nhiên, shell có thể thực hiện xử lý trực tiếp, sử dụng cái gọi là mill, hoặc pipemill, (vì lệnh command | while read var1 var2 ...; do
# process each line, using variables as parsed into $var1, $var2, etc
# (note that this may be a subshell: var1, var2 etc will not be available
# after the while loop terminates; some shells, such as zsh and newer
# versions of Korn shell, process the commands to the left of the pipe
# operator in a subshell)
done
Pipemill trên có thể không hoạt động như dự định nếu phần thân của vòng lặp bao gồm các lệnh, chẳng hạn như Chú thích
|