Hầu hết người dùng Linux không hiểu về hoạt động bên trong của hệ điều hành. Bạn có thể chạy các lệnh Linux trên shell trong một thời gian dài, nhưng bạn đã bao giờ tự hỏi điều gì đang xảy ra khi bạn nhấn phím Enter ?
Bài viết dưới đây sẽ giới thiệu sơ qua về cách shell xử lý lệnh đã nhập trong Linux.
Xử lý lệnh
Khi bạn nhập một lệnh, điều đầu tiên mà shell làm là chia toàn bộ lệnh thành “token” (tạm dịch là mã thông báo). Sau đó, shell sẽ tìm kiếm tên chương trình thuộc token đầu tiên trong dòng lệnh.
Nếu nó không tìm thấy chương trình trong bất kỳ thư mục nào trong đường dẫn tìm kiếm được xác định trong biến môi trường $PATH hoặc trong thư mục cục bộ với toán tử .\, hoặc nó không phải là shell alias hoặc hàm shell, shell sẽ báo lỗi. Nếu nó tìm thấy một lệnh hợp lệ, shell sẽ đi qua từng token khác và quyết định xem đó là một biến, một tham số shell hay một đối số cho lệnh đó.
Nếu shell xác định rằng đó là một biến hoặc một tham số, ví dụ như toán tử ~ cho thư mục chính, shell sẽ mở rộng hoặc thay thế chúng bằng các giá trị ban đầu trong lệnh.
Khi shell đã mở rộng bất kỳ tham số hoặc biến nào, nó sẽ truyền chuỗi lệnh tới lệnh, chạy chương trình với các đối số của nó. Shell không xác định xem có bất kỳ đối số nào là hợp lệ hay không. Đó là việc của lệnh.
Chạy lệnh
Khi shell khởi chạy một lệnh khác, làm thế nào để nó quay lại cùng một lời nhắc (prompt) bạn đã dùng trước đó? Shell tạo ra một bản sao của chính nó, quá trình này được gọi là fork (tạm dịch là phân nhánh). Bản sao của shell này thay thế chính nó bằng lệnh, với tất cả các đối số đã được xử lý từ trước. Đây được gọi là “exec” (viết tắt của execute, nghĩa là thực thi) và quy trình kết hợp được gọi là “fork-and-exec”.
Ví dụ: khi bạn chạy lệnh ls, quá trình shell sẽ tự fork bằng cách sử dụng phương thức fork() và tạo một phiên bản shell khác. Trong số hai tiến trình shell đang chạy trên hệ thống, shell thứ hai sẽ thực thi lệnh ls bằng cách sử dụng hàm exec(), tự chuyển đổi thành một instance của lệnh ls.
Trong lúc đó, shell gốc sẽ đợi lệnh hoàn thành. Đây là lý do tại sao bạn có thể sử dụng job control để tạm ngừng job và để các job chạy ở chế độ nền trong shell.
Báo cáo Trạng thái Thoát
Các lệnh Linux báo cáo chúng có chạy thành công hay không thông qua trạng thái thoát (exit status). Đúng như tên gọi của nó, các chương trình báo cáo trạng thái thoát của chúng khi chúng chạy xong. Chúng làm điều này thông qua biến môi trường $?, chứa trạng thái thoát của lệnh chạy cuối cùng.
Theo quy ước, trạng thái thoát bằng 0 cho biết lệnh đã thực thi thành công, trong khi bất kỳ cái gì không phải là 0 thường có nghĩa là lỗi. Shell của bạn cũng có thể chỉ ra trạng thái thoát khác 0 trên dòng lệnh tùy thuộc vào cách cấu hình lời nhắc của bạn.
Ví dụ, ảnh chụp màn hình ở trên cho thấy một lời nhắc Zsh hiển thị trạng thái thoát lỗi 127 do lệnh không tồn tại.
Bạn đã biết cách hoạt động của các lệnh Linux
Bây giờ bạn đã biết về cách shell Linux xử lý một lệnh, phân nhánh và thực thi chính nó cũng như cách các chương trình báo cáo trạng thái thoát của chúng, bạn có thể sử dụng dòng lệnh hiệu quả hơn.
Nếu có bất kỳ thắc mắc nào, hãy để lại dưới phần bình luận để được giải đáp nhé.
Vân Nguyễn
Dịch từ: https://www.makeuseof.com/what-happens-when-you-run-command-linux/
Bình luận (0
)