Mar 2, 2012

Quá trình thực thi và cách xây dựng chương trình Shell


  • Chạy các lệnh trên shell


Bash sẽ tự quyết định kiểu chương trình nào sẽ được thực thi. Các chương trình bình thường sẽ gồm các lệnh được biên dịch sẵn trong hệ thống. Khi một chương trình như vậy được thực thi, sẽ có một process mới được tạo ra, bởi Bash sẽ tạo một bản sao của chính nó, tiến trình con ấy sẽ có cùng các biến môi trường như cha, chỉ khác duy nhất process ID. Thủ tục này được gọi là forking.


Sau khi thực hiện forking cho process, không gian địa chỉ (address space) của tiến trình con sẽ bị ghi đè bởi các dữ liệu của các process mới hơn. Điều này được thực hiện thông qua lời gọi exec tới hệ thống. Mô hình fork-and-exect sẽ chuyển (switch) từ một command cũ sang một command mới, trong khi môi trường thực thi vẫn được giữ nguyên, bao gồm các cấu hình thiết bị IO, biến môi trường và các quyền ưu tiên. Mô hình này được sử dụng cho việc tạo tất cả các *NIX process, kể cả tiến trình init (pid=1). Tiến trình init được fork trong chuỗi thủ tục boot (thủ tục bootstrapping).
Chạy các chương trình trong một script
Khi chương trình được thực thi là một script, bash sẽ tạo một tiến trình bash mới bằng thủ tục fork. Shell con này sẽ đọc từng dòng trong script, các lệnh trong từng dòng đó được đọc, thông dịch và thực thi như là nhập trực tiếp từ bàn phím.
Khi shell con thực thi, shell cha sẽ đợi nó kết thúc, khi nào shell con kết thúc ở trạng thái terminated, thì shell cha sẽ chạy tiếp.

  • Các thành phần thường dùng trong một shell block/script


Shell command (lệnh): một lệnh cơ bản sẽ gồm có lệnh và các tham số, ngăn cách bởi các khoảng trắng. Các lệnh phức tạp hơn được tổ hợp từ các lệnh đơn theo một số cách thức như sử dụng pipeline, tee, loop, conditional construct,…
Shell function (hàm): hàm là cách nhóm các lệnh đơn dưới dạng một tên gọi chung, nó có thể được thực thi tương tự như một lệnh thông thường. Các hàm trong shell sẽ được thực thi trong context hiện tại của shell và không cần có một tiến trình shell con nào được sinh ra để thông dịch chúng.
Shell parameter (tham số): một tham số là một thực thể chứa các giá trị, nó có thể là một tên, một số hoặc một giá trị cụ thể. Với shell thì một biến là một tham số lưu trữ một tên. Một biến có một giá trị kèm theo không hoặc nhiều các thuộc tính (attribute). Các biến được khai báo bằng lệnh declare và được hủy bằng lệnh unset.
Shell redirection (chuyển hướng output): output của mỗi lệnh có thể được tái định hướng tới các terminal thông qua các phép redirection.
Shell script: khi một file chứa các lệnh shell được truyền vào dưới dạng một tham số không phải option cho bash (không kèm –c hay -s) thì bash sẽ tạo một shell con dạng không tương tác, shell này sẽ tìm kiếm file script này trong thư mục hiện thời, sau đó tìm trong các đường dẫn tồn tại trong PATH nếu như không tìm thấy ở thư mục hiện tại.

  • Cú pháp tổng quát của một script


Khai báo shell sẽ chạy
Khi chạy một script ở shell con (subshell) thì cần định nghĩa shell sẽ chạy script đó. Để khai báo điều này, ta sử dụng chỉ lệnh “#!” ở dòng đầu tiên của script. Đặc điểm của cụm này đó là nó không bị coi là comment, sau chuỗi này sẽ là đường dẫn tới shell cần gọi. Ví dụ: #!/bin/sh
Các comment
Cũng như các ngôn ngữ lập trình khác, ta cần sử dụng comment hợp lý để dễ bảo trì sau này. Ngoại trừ dòng khai báo shell, các dòng nào bắt đầu bởi # sẽ được coi là comment.
Debug Script
Để debug toàn bộ script, thì khi gọi shell chạy script, ta thêm option –x vào. Ví dụ: #bash –x test.sh
Để debug một đoạn trong script thì bọc đoạn đó trong cặp set –x và set +x như sau:

set –x
[… commands]
set +x
Trong đó, set –x sẽ bật chế độ debug, còn set +x sẽ tắt chế độ này

  • Tiêu chí của một script tốt


Về cấu trúc
+ chạy không lỗi
+ chạy đúng chức năng yêu cầu
+ logic xử lý rõ ràng, sáng sủa, dể hiểu
+ có thể tái sử dụng

<còn tiếp>

No comments:

Post a Comment