5.5 Chuyển hướng đầu vào/đầu ra, đường ống và bộ lọc
107
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ệnh grep, 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ệnh grep đượ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úc hoà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.
5.5.3
Bộ lọc
Ví dụ cuối cùng ở trên (ví dụ với câu lệnh grep) có thể dùng để minh họa cho
một khái niệm qua trọng khác, đó là, bộ lọc chương trình. Bộ lọc – đó là lệnh
(hay chương trình), mà tiếp nhận dữ liệu vào, thực hiện một vài biến đổi trên dữ
liệu này và đưa ra kết quả ở đầu ra tiêu chuẩn (từ đây còn có thể chuyển đến nơi
nào đó theo ý muốn của người dùng). Các câu lệnh - bộ lọc bao gồm các lệnh đã
nói đến ở trên cat, more, less, wc, cmp, diff, và cả những câu lệnh có
trong bảng
Một bộ lọc đặc biệt, câu lệnh tee, nhân đôi dữ liệu đầu vào, một mặt gửi dữ
liệu này đến đầu ra tiêu chuẩn, mặt khác ghi nó (dữ liệu) vào tập tin (người dùng
cần đặt tên). Dễ thấy rằng theo chức năng của mình lệnh tee tương tự như nhóm
ký tự chuyển hướng 1>&file. Khả năng của bộ lọc có thể mở rộng với việc sử dụng