4 Làm quen với hệ thống tập tin ext3fs
5.5.2 Sử dụng |
Một trường hợp đặc biệt của chuyển hướng đầu ra là sự tổ chức các đường ống (ha y còn có thể gọi là kênh giữa các chương trình, hoặc băng chuyền). Hai hay vài câu lệnh, mà đầu ra của lệnh trước dùng làm đầu vào cho lệnh sau, liên kết với nhau (có thể nói phân cách nhau, nếu muốn) bởi ký hiệu gạch thẳng đứng - “|”. Khi này đầu ra tiêu chuẩn của lệnh đứng bên trái so với |dược chuyển đến đầu vào tiêu chuẩn của chương trình, dứng bên phải so với|. Ví dụ:
maikhai@fpt:/sw$ cat ls.txt | grep knoppix | wc -l
Dòng này có nghĩa là kết quả của lệnh cat, tức là nội dung tập tin ls.txt, sẽ được chuyển đến đầu vào của lệnhgrep, lệnh này sẽ phân chia nội dung nói trên và chỉ lấy ra những dòng nào có chứa từ knoppix. Đến lượt mình, kết qủa của lệnhgrepđược chuyển tới đầu vào của lệnh wc -l, mà tính số những dòng thu được. Đường ống sử dụng để kết hợp vài chương trình nhỏ lại với nhau (mỗi chương trình thực hiện một biến đổi xác định nào đó trên đầu vào) tạo thành một lệnh tổng quát, mà kết quả của nó sẽ là một biến đổi phức tạp. Cần chú ý rằng, hệ vỏ gọi và thực hiện tất cả các câu lệnh có trong đường ống cùng một lúc, chạy mỗi lệnh đó trong một bản sao hệ vỏ riêng. Vì thế ngay khi chương trình thứ nhất bắt đầu đưa kết quả ở đầu ra, chương trình tiếp theo bắt đầu xử lý kết quả này. Cũng y như vậy, các lệnh tiếp theo thực hiện các công việc của mình: chờ dữ liệu từ lệnh trước và đưa kết quả cho lệnh tiếp theo, giống như một dây chuyền sản xuất. Nếu như muốn một lệnh nào đó kết thúchoàn toàn, trước khi thực hiện lệnh tiếp theo, bạn có thể sưẻ dụng trên một dòng cả ký hiệu dây chuyền
|, cũng như dấu chấp phẩy ;. Trước mỗi dấu chấm phẩy, hệ vỏ sẽ dừng lại và chờ cho đến khi thực hiện xong tất cả các câu lệnh trước của đường ống. Trạng thái thoát ra (giá trị lôgíc, mà được trả lại sau khi thực hiện xong chương trình) của một đường ống sẽ trùng với trạng thái thoát ra của câu lệnh sau cùng trong đường ống. Ở trước câu lệnh đầu tiên của đường ống có thể đặt ký hiệu “!”, khi đó trạng thái thoát ra của đường ống sẽ là phủ định lôgíc của trạng thát thoát ra của lệnh cuối cùng trong đường ống. Tức là nếu trạng thái thoát ra của lệnh cuối cùng bằng 0 thì trạng thái thoát ra của đường ống sẽ bằng 1 và ngược lại. Hệ vỏ chờ cho tất cả các câu lệnh kết thúc rồi mới xác định và đưa ra giá trị này.