1
2
CHƯƠNG 7. LẬP TRÌNH SHELL VÀ LẬP TRÌNH C TRÊN LINUX
7.1. Cách thức pipes và các yếu tố cơ bản lập trình trên shell
7.1.1. Cách thức pipes
Trong Linux có một số loại shell, shell ngầm định là bash. Shell cho phép người dùng
chạy từng lệnh shell (thực hiện trực tiếp) hoặc dãy lệnh shell (file script) và đặc biệt hơn là
theo dạng thông qua ống dẫn (pipe).
•
Trong một dòng lệnh của shell có thể thực hiện một danh sách các lệnh tuần tự nhau
dạng:
<lệnh> [; <lệnh>]...
Như vậy danh sách lệnh là dãy các lệnh liên tiếp nhau, cái sau cách cái trước bởi dấu
chấm phảy ";"
Ví dụ,
$ cal 10 1999; cal 11 1999 ; cal 12 1999
Shell cho người dùng cách thức đặc biệt thực hiện các lệnh tuần tự nhau, cái ra của lệnh
trước là cái vào của lệnh sau và không phải thông qua nơi lưu trữ trung gian.
•
Sử dụng ống dẫn là cách thức đặc biệt trong UNIX và Linux, được thể hiện là một cách
thức của shell để truyền thông liên quá trình. ống dẫn được tổ chức theo kiểu cấu trúc
dữ liệu dòng xếp hàng "vào trước ra trước" FIFO "First In First Out". Trong cấu trúc
dòng xếp hàng, một đầu của dòng nhận phần tử vào và còn đầu kia lại xuất phần tử ra.
Trong ngữ cảnh của shell, với hai quá trình A và B được kết nối một ống dẫn được thể
hiện như sau:
Như vậy đầu ra của A thông thường hoặc là thiết bị ra chuẩn (màn hình) hoặc là một
File (là một tham số của lệnh) được thay bằng "đầu nhập của ống dẫn". Tương tự, đầu vào
của B thông thường hoặc là thiết bị vào chuẩn (bàn phím) hoặc là một File (là một tham số
của lệnh) được thay bằng "đầu xuất của ống dẫn". Dòng byte lần lượt "chảy" từ quá trình A
sang quá trình B.
Mô tả cách thức sử dụng đường ống trong shell như sau:
<lệnh phức hợp>
là hoặc <lệnh> hoặc (<lệnh>[;<lệnh>]...)
Vậy đường ống có dạng
<lệnh phức hợp> | <lệnh phức hợp>
Lệnh phức hợp phía sau có thể không có đối số. Trong trường hợp đó, thông tin kết quả
từ lệnh phía trước trở thành thông tin input của lệnh ngay phía sau mà không chịu tác động
theo cách thông thường của lệnh trước nữa.
Ví dụ, $ cal 1999 | more
Nội dung lịch năm 1999 (lệnh cal đóng vai trò quá trình A) không được in ngay ra màn
hình như thông thường theo tác động của lệnh cal nữa mà được lưu lên một "file" tạm thời
kiểu "ống dẫn" của hệ thống và sau đó trở thành đối số của lệnh more (lệnh more đóng vai
trò quá trình B).
Trong chương trình, có thể dùng ống dẫn làm file vào chuẩn cho các lệnh đọc tiếp theo.
Ví dụ,
ls -L | \
Quá trình B
Quá trình A