Khác biệt giữa bản sửa đổi của “Pipeline (Unix)”

Bách khoa toàn thư mở Wikipedia
Nội dung được xóa Nội dung được thêm vào
n →‎top: replaced: . → . using AWB
Tạo với bản dịch của trang “Pipeline (Unix)
Dòng 1: Dòng 1:
'''Pipeline''' là một hình thức chuyển hướng (chuyển đầu ra tiêu chuẩn sang một số đích khác) được sử dụng trong Linux và các hệ điều hành giống Unix khác để gửi đầu ra của một lệnh / chương trình / tiến trình tới một lệnh / chương trình / quy trình khác để xử lý thêm. Các hệ thống [[Unix]] / [[Linux]] cho phép xuất ra một lệnh được kết nối với stdin của một lệnh khác. Bạn có thể làm cho nó làm như vậy bằng cách sử dụng ký tự ống ‘|.


[[Tập tin:Pipeline.svg|nhỏ|280x280px| Một đường dẫn gồm ba quá trình chương trình chạy trên Text terminal. ]]
Pipe được sử dụng để kết hợp hai hoặc nhiều lệnh và trong đó, đầu ra của một lệnh đóng vai trò là đầu vào cho lệnh khác và lệnh này đầu ra có thể đóng vai trò là đầu vào cho lệnh tiếp theo, v.v. Nó cũng có thể được hình dung như một kết nối tạm thời giữa hai hoặc nhiều lệnh / chương trình / quy trình. Các chương trình dòng lệnh thực hiện xử lý thêm được gọi là bộ lọc.
Trong [[Tương tự Unix|các]] [[hệ điều hành]] máy tính [[Tương tự Unix|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|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, nhưng chúng được thực hiện [[Tương tranh (khoa học máy tính)|đồng thời]] . Khái niệm về đường ống được bảo vệ bởi Douglas McIlroy tại hệ điều hành [[Unix]] của [[Phòng thí nghiệm Bell|Bell Labs]], trong sự phát triển của Unix, định hình triết lý hộp công cụ của nó. <ref>{{Chú thích web|url=http://www.princeton.edu/~hos/Mahoney/expotape.htm|title=The Unix Oral History Project: Release.0, The Beginning|author=Mahoney|first=Michael S.|quote=McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.}}</ref> <ref> http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html{{dead link|date=December 2017 |bot=InternetArchiveBot |fix-attempted=yes }} </ref> 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 cho phép 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 quy 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ê nhiều lệnh, được phân tách bằng các thanh dọc ("ống" trong phiên bản Unix phổ biến): <source lang="bash" line="1"> process1 | process2 | process3 </source> 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 dòng lệnh của terminal :<source lang="bash" line="1"> ls -l | grep key | less </source> " <code>ls -l</code> " tạo ra một tiến trình, đầu ra (stdout) được dẫn đến đầu vào (stdin) của tiến trình "grep key"; và tương tự như vậy cho tiến trình cho "less". Mỗi [[tiến trình]] lấy đầu vào từ tiến trình trước và tạo đầu ra cho tiến trình tiếp theo thông qua ''các luồng tiêu chuẩn'' . Mỗi " <code>|</code> " bảo với shell kết nối đầu ra tiêu chuẩn của lệnh bên trái với đầu vào tiêu chuẩn của lệnh bên phải bằng một cơ chế giao tiếp giữa các quá trình gọi là ống (ẩn danh), được triển khai trong hệ điều hành. Ống là đơn hướng; dữ liệu chảy qua đường ống từ trái sang phải.
Kết nối trực tiếp giữa các lệnh / chương trình / quy trình này cho phép chúng hoạt động đồng thời và cho phép dữ liệu được truyền giữa chúng liên tục thay vì phải chuyển qua các tệp văn bản tạm thời hoặc qua màn hình hiển thị.


== Đường ống trong giao diện dòng lệnh ==
Các đường ống là các luồng dữ liệu i.e đơn hướng từ trái sang phải qua đường ống.
Tấ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 [[ASCII|ký tự]] thanh dọc [[ASCII]] " <code>|</code> " (vì lý do này, thường được gọi là "ký tự ống"). Shell bắt đầu các quá trình và sắp xếp các kết nối cần thiết giữa các luồng tiêu chuẩn của chúng (bao gồm cả các bộ đệm lưu trữ ).

=== Luồng lỗi ===
Theo 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 " <code>|&</code> " thay vì " <code>|</code> " biểu thị rằng luồng lỗi tiêu chuẩn cũng sẽ được hợp nhất với đầu ra tiêu chuẩn và được đưa vào quy trình tiếp theo. Shell Bourne cũng có thể hợp nhất luồng lỗi tiêu chuẩn bằng<code>|&</code> kể từ bash 4.0 <ref>{{Chú thích web|url=https://tiswww.case.edu/php/chet/bash/NEWS|title=Bash release notes|website=tiswww.case.edu|access-date=2017-06-14}}</ref> hoặc sử dụng <code>2>&1</code>, cũng cũng để chuyển hướng nó sang một tệp khác.

=== Pipemill ===
Trong các đường ống đơn giản được sử dụng phổ biến nhất, vỏ kết nối một loạt các quy trình phụ thông qua các đường ống và thực hiện các lệnh bên ngoài trong mỗi quy trình con. 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 <code lang="bash">while</code> được sử dụng để "nghiền" các kết quả từ lệnh ban đầu). Cấu trúc này thường trông giống như: <source lang="bash" line="1">
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
</source> 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ư <code>cat</code> và <code>ssh</code>, được đọc từ <code>stdin</code> : <ref>{{Chú thích web|url=https://web.archive.org/web/20120306135439/http://72.14.189.113/howto/shell/while-ssh/|title=Shell Loop Interaction with SSH|author=|date=6 March 2012|website=archive.org}}</ref> trong lần lặp đầu tiên của vòng lặp, một chương trình (hãy gọi nó ''là vòi nước'' ) sẽ đọc đầu ra từ <code>command</code> và vòng lặp sẽ chấm dứt sau đó (với kết quả tùy thuộc vào chi tiết cụ thể của vòi nước). Có một vài cách có thể để tránh hành vi này. Đầu tiên, một số vòi nước hỗ trợ một tùy chọn để vô hiệu hóa đọc từ <code>stdin</code> (ví dụ: <code>ssh -n</code> ). Ngoài ra, nếu vòi nước không ''cần'' đọc bất kỳ đầu vào nào từ <code>stdin</code> , thì có thể dùng <code>&#x3C; /dev/null</code> làm đầu vào.
[[Thể loại:Unix]]
[[Thể loại:Pages with unreviewed translations]]

Phiên bản lúc 04:44, ngày 23 tháng 4 năm 2019

Một đường dẫn gồm ba quá trình chương trình chạy trên Text terminal.

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, nhưng chúng được thực hiện đồng thời . Khái niệm về đường ống được bảo vệ bởi Douglas McIlroy tại hệ điều hành Unix của Bell Labs, trong sự phát triển của Unix, định hình triết lý hộp công cụ của nó. [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 cho phép 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 quy 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ê nhiều 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 dòng lệnh của terminal :

 ls -l | grep key | less

" ls -l " tạo ra một tiến trình, đầu ra (stdout) được dẫn đến đầu vào (stdin) của tiến trình "grep key"; và tương tự như vậy cho tiến trình cho "less". Mỗi tiến trình lấy đầu vào từ tiến trình trước và tạo đầu ra cho tiến trình tiếp theo thông qua các luồng tiêu chuẩn . Mỗi " | " bảo với shell kết nối đầu ra tiêu chuẩn của lệnh bên trái với đầu vào tiêu chuẩn của lệnh bên phải bằng một cơ chế giao tiếp giữa các quá trình gọi là ống (ẩn danh), được triển khai trong hệ điều hành. Ống là đơn hướng; dữ liệu chảy qua đường ống từ trái sang phải.

Đường ống trong giao diện dòng lệnh

Tấ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 " | " (vì lý do này, thường được gọi là "ký tự ống"). Shell bắt đầu các quá trình và sắp xếp các kết nối cần thiết giữa các luồng tiêu chuẩn của chúng (bao gồm cả các bộ đệm lưu trữ ).

Luồng lỗi

Theo 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 " |& " thay vì " | " biểu thị rằng luồng lỗi tiêu chuẩn cũng sẽ được hợp nhất với đầu ra tiêu chuẩn và được đưa vào quy trình tiếp theo. Shell Bourne cũng có thể hợp nhất luồng lỗi tiêu chuẩn bằng|& kể từ bash 4.0 [3] hoặc sử dụng 2>&1, cũng cũng để chuyển hướng nó sang một tệp khác.

Pipemill

Trong các đường ống đơn giản được sử dụng phổ biến nhất, vỏ kết nối một loạt các quy trình phụ thông qua các đường ống và thực hiện các lệnh bên ngoài trong mỗi quy trình con. 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 while được sử dụng để "nghiền" các kết quả từ lệnh ban đầu). Cấu trúc này thường trông giống 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ư catssh, được đọc từ stdin : [4] trong lần lặp đầu tiên của vòng lặp, một chương trình (hãy gọi nó là vòi nước ) sẽ đọc đầu ra từ command và vòng lặp sẽ chấm dứt sau đó (với kết quả tùy thuộc vào chi tiết cụ thể của vòi nước). Có một vài cách có thể để tránh hành vi này. Đầu tiên, một số vòi nước hỗ trợ một tùy chọn để vô hiệu hóa đọc từ stdin (ví dụ: ssh -n ). Ngoài ra, nếu vòi nước không cần đọc bất kỳ đầu vào nào từ stdin , thì có thể dùng < /dev/null làm đầu vào.

  1. ^ Mahoney, Michael S. “The Unix Oral History Project: Release.0, The Beginning”. McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.
  2. ^ http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html[liên kết hỏng]
  3. ^ “Bash release notes”. tiswww.case.edu. Truy cập ngày 14 tháng 6 năm 2017.
  4. ^ “Shell Loop Interaction with SSH”. archive.org. 6 tháng 3 năm 2012.