Máy Tính

Giải Mã Các Loại Lệnh Linux: Cách Thức Hoạt Động Sâu Bên Trong

Khi bạn gõ một lệnh Linux vào terminal và nhấn Enter, điều gì thực sự xảy ra? Hành động tưởng chừng đơn giản này lại ẩn chứa nhiều cơ chế phức tạp. Tùy thuộc vào việc bạn đang chạy một chương trình thực thi, một shell script, một lệnh nội bộ (builtin) của shell, một hàm do người dùng định nghĩa hay một alias, hệ thống sẽ có cách xử lý khác nhau. Với vai trò là một chuyên gia về hệ điều hành, chúng ta sẽ cùng tìm hiểu sâu hơn về cách các lệnh Linux hoạt động, giúp bạn nắm vững hơn môi trường dòng lệnh.

Tổng Quan Về Các Loại Lệnh Linux

Trong Linux, các lệnh mà bạn tương tác hàng ngày được phân loại thành năm dạng chính, mỗi loại có cách thức hoạt động và ưu tiên riêng:

  • Chương trình (nhị phân, hoặc thực thi): Đây là các file chương trình được biên dịch, lưu trữ trên đĩa cứng ở một định dạng được hệ điều hành nhận diện (như ELF trên Linux hay Mach-O trên macOS). Shell chuyển giao các file này cho nhân hệ điều hành (kernel) để thực thi.
  • Shell script: Là một dạng chương trình cấp cao hơn, được viết bằng văn bản có thể đọc được bởi con người. Shell script có thể gọi các lệnh khác và thường được viết bằng ngôn ngữ thông dịch như Perl hoặc Python.
  • Lệnh nội bộ (Builtin): Là các lệnh được tích hợp sẵn bên trong shell. Chúng luôn có sẵn và thường chạy ở cấp độ thấp để thực hiện các thao tác ảnh hưởng trực tiếp đến chính shell.
  • Hàm shell (Shell function): Giống như một shell script thu nhỏ, gói gọn một tập hợp các lệnh dưới một tên duy nhất. Các hàm shell thường được nạp vào để luôn sẵn sàng sử dụng bằng tên của chúng.
  • Alias: Là một tên thay thế ngắn gọn cho bất kỳ loại lệnh nào ở trên. Bạn có thể tạo alias để tiết kiệm thời gian và công sức khi chạy các tác vụ phổ biến.

Thứ tự mà một shell như Bash tìm kiếm các loại lệnh này rất quan trọng. Đơn giản là, Bash ưu tiên các lệnh theo thứ tự: alias, hàm (function), lệnh nội bộ (builtin), chương trình/script.

1. Chạy Một Chương Trình Thực Thi

Loại lệnh quen thuộc nhất là một file chương trình thực thi. Nhiều chương trình phổ biến là một phần của tiêu chuẩn POSIX, có nghĩa là chúng sẽ có sẵn trên hầu hết các hệ thống Unix hoặc tương tự Unix, bao gồm Linux và macOS. Ví dụ về các lệnh này bao gồm cat, diff, và vi.

Các chương trình dòng lệnh khác như Apache, Neofetch, hay tree có thể cần được cài đặt vì chúng thường không được bao gồm mặc định trong một bản phân phối. Nhưng, giống như các chương trình lệnh POSIX, chúng sẽ chạy thông qua một file chương trình duy nhất nằm đâu đó trên đĩa của bạn.

Có hai cách phổ biến để chạy một chương trình. Đầu tiên, bạn có thể gõ đường dẫn đến file chương trình, chẳng hạn như ./myprog hoặc /usr/bin/awk. Nếu phần đầu tiên của lệnh chứa bất kỳ dấu gạch chéo nào, shell sẽ cố gắng tìm một file tại đường dẫn tương ứng. Ví dụ, bạn có thể chạy một chương trình tại /bin/cat như sau:

/bin/cat myfile

Shell sau đó sẽ kiểm tra xem có một chương trình thực thi tại /bin/cat hay không, sau đó chạy nó nếu nó tồn tại.

Trên Linux, các chương trình thực thi thường không có phần mở rộng file, vì vậy một lệnh như “grep” được chứa trong một file tên là grep. Đây chỉ là một quy ước, vì tiện lợi khi làm cho các chương trình thực thi có thể nhận diện được chỉ bằng tên file. Tuy nhiên, nếu bạn thực sự muốn, bạn có thể đặt tên cho các chương trình thực thi của mình bất cứ thứ gì bạn muốn, như “myprog.exe” hoặc “myprog.RUNME.”

Trường hợp thứ hai xảy ra khi bạn gõ tên chương trình mà không có đường dẫn; ví dụ:

cat myfile

Với một hệ thống được thiết lập đúng cách, điều này sẽ có cùng hiệu ứng như trước, vì shell sẽ định vị cùng một chương trình cat. Nó làm như vậy bằng cách kiểm tra một biến môi trường đặc biệt tên là PATH, trông giống như sau:

Biến môi trường PATH trong Linux, hiển thị các thư mục hệ thống mà shell tìm kiếm lệnh.Biến môi trường PATH trong Linux, hiển thị các thư mục hệ thống mà shell tìm kiếm lệnh.

Đây là một danh sách các đường dẫn được phân tách bằng dấu hai chấm mà shell sẽ tìm kiếm để định vị một chương trình. Thứ tự rất quan trọng vì bạn có thể có hai file cùng tên ở các vị trí khác nhau. Ví dụ, nếu bạn có một file /usr/bin/grep và một file /bin/grep, PATH ở trên sẽ khiến shell chạy phiên bản /usr/bin. Hệ thống này cho phép bạn ghi đè một lệnh toàn hệ thống bằng một lệnh tùy chỉnh phù hợp hơn với nhu cầu của bạn, điều này có thể rất hữu ích.

2. Chạy Một Shell Script

Một shell script chạy hơi khác so với một chương trình thực thi, và nó là một loại file rất khác. Một shell script đơn giản trông như thế này:

#!/bin/sh
echo Just a simple, pointless shell script

Dòng đầu tiên được gọi là “shebang” hoặc “hash-bang”, được đặt tên theo sự kết hợp của ký tự #!. Đây là một chỉ dẫn đặc biệt cho shell biết nên sử dụng trình thông dịch nào cho phần còn lại của script. Trong trường hợp trên, đó là chính shell, tại /bin/sh.

Phần còn lại của script là một chương trình văn bản mà trình thông dịch hiểu. Trong trường hợp này, shell có thể chạy các lệnh như echo theo cách tương tự như khi bạn gõ chúng trên dòng lệnh.

Nếu không, một shell script rất giống với một chương trình thực thi, và shell của bạn sẽ tìm kiếm nó bằng cách sử dụng biến PATH theo cùng một cách. Đối với cả chương trình và shell script, điều quan trọng cần lưu ý là quyền trên file tương ứng sẽ ảnh hưởng đến cách bạn chạy nó. Với quyền thực thi được đặt, bạn có thể chạy chương trình bằng cách gõ tên hoặc đường dẫn của nó. Nhưng nếu quyền thực thi không được đặt, bạn sẽ thấy một lỗi:

Lỗi "Permission denied" khi cố gắng chạy một file script Linux không có quyền thực thi.Lỗi "Permission denied" khi cố gắng chạy một file script Linux không có quyền thực thi.

Bạn luôn có thể chạy một file như vậy bằng cách truyền tên của nó làm đối số cho một trình thông dịch thích hợp. Ví dụ, bạn có thể chạy một shell script như sau:

sh myscript.sh

Bạn thậm chí có thể chạy một chương trình thực thi như thế này, nhưng bạn sẽ cần thực hiện một số nghiên cứu trước. Lệnh file cung cấp thông tin về loại file, bao gồm cả trình thông dịch của nó:

Sử dụng lệnh 'file' để xác định loại file nhị phân và 'ls -l' để kiểm tra quyền thực thi trong Linux.Sử dụng lệnh 'file' để xác định loại file nhị phân và 'ls -l' để kiểm tra quyền thực thi trong Linux.

Trong trường hợp này, bạn có thể chạy chương trình nhị phân pwd bằng cách sử dụng chương trình /lib/ld-linux-aarch64.so.1:

Thực thi một chương trình nhị phân Linux thông qua trình thông dịch đã xác định, bỏ qua quyền thực thi.Thực thi một chương trình nhị phân Linux thông qua trình thông dịch đã xác định, bỏ qua quyền thực thi.

3. Thực Thi Lệnh Nội Bộ Shell (Builtin)

Một số lệnh cơ bản đến mức chúng cần hoạt động theo một cách hơi khác. Đây được gọi là các lệnh nội bộ (builtins) vì chúng, về cơ bản, là một phần của chính shell.

Các lệnh nội bộ thường là các lệnh cấp thấp và bạn sử dụng thường xuyên: cd, echo, và kill là những ví dụ phổ biến. Không giống như các chương trình và shell script, các lệnh này không tương ứng với một file cụ thể vì chúng là một phần của chính shell, được biên dịch vào file thực thi của shell.

Một số hệ thống có thể bao gồm các wrapper script chạy các lệnh nội bộ. Ví dụ, trên hệ thống macOS của tôi, có một script /usr/bin/cd sử dụng lệnh builtin để chạy lệnh nội bộ tương ứng. Điều này nhằm mục đích tương thích với POSIX, và bạn có thể bỏ qua phiên bản script một cách an toàn.

Các lệnh nội bộ có thể khó tìm hiểu vì chúng hoặc không có trang hướng dẫn (e.g. trên Ubuntu Linux) hoặc tất cả chúng đều có một trang hướng dẫn lớn, chung (macOS). Chương trình tldr là một cách tuyệt vời để tìm hiểu thêm về các lệnh nội bộ.

Vì những lý do tương tự, các lệnh nội bộ thường hỗ trợ ít tùy chọn dòng lệnh hơn so với các chương trình đầy đủ chức năng. Ví dụ, cd thường chỉ hỗ trợ hai tùy chọn khá ít được biết đến: -L (để theo dõi liên kết tượng trưng) và -P (để tránh liên kết tượng trưng). Điều này có nghĩa là, đáng tiếc, các tùy chọn như -h hoặc --help không được hỗ trợ.

4. Gọi Một Hàm Shell

Một lệnh cũng có thể là một lời gọi đến một hàm. Bất cứ lúc nào trong một phiên làm việc, bạn có thể nạp hoặc định nghĩa một hàm bằng cú pháp này (trong Bash):

function_name() {
  commands
}

Ngoài ra, bạn có thể sử dụng cú pháp chèn từ khóa “function” trước tên hàm và bỏ dấu ngoặc đơn sau nó:

function function_name {
  commands
}

Bạn có thể gọi một hàm bằng cách gõ tên của nó, theo sau là bất kỳ đối số nào. Ví dụ, tôi có hàm trợ giúp sau được định nghĩa trong một file:

mkd () { mkdir -p "$@" && cd "$@" || exit; }

Sau đó, tôi nạp file này từ script điều khiển khởi động của shell (~/.zshrc), và tôi có thể chạy lệnh này để tạo một thư mục mới và ngay lập tức chuyển đến đó:

mkd new_dir

Bạn có thể gọi một hàm như vậy trên dòng lệnh bất cứ khi nào bạn muốn. Bạn cũng có thể gọi nó từ các script, nhưng hãy nhớ rằng nó cần được nạp (sử dụng lệnh nội bộ source, hoặc tương đương của nó là ., để làm điều đó).

5. Sử Dụng Alias

Alias là một tiện ích giúp bạn tiết kiệm thời gian gõ các tên lệnh dài hoặc các tùy chọn phổ biến. Ví dụ, trên hệ thống của tôi, tôi có một alias để đảm bảo danh sách file được hiển thị có màu, với hậu tố loại:

ls='ls -GF'

Bây giờ, nếu tôi chỉ gõ “ls,” lệnh “ls -GF” sẽ chạy thay thế.

Bạn có thể tạo một alias bất cứ lúc nào, bằng cách sử dụng lệnh nội bộ alias, ví dụ:

alias ls="ls -GF"

Lưu ý rằng cần có dấu ngoặc kép khi bạn chạy alias, nếu chuỗi thay thế chứa bất kỳ khoảng trắng nào. Bạn có thể xem tất cả các alias bằng cách chạy alias, và bạn có thể xóa một alias bằng lệnh unalias. Một lần nữa, bạn sẽ muốn thêm các alias vào một file khởi động, như ~/.zshrc hoặc ~/.bashrc, nếu bạn muốn chúng được áp dụng qua các phiên làm việc.

Kết Luận

Việc hiểu rõ cách thức các lệnh Linux được xử lý bởi shell là chìa khóa để làm chủ môi trường dòng lệnh. Từ các chương trình thực thi nhị phân đến các shell script linh hoạt, các lệnh nội bộ cốt lõi, các hàm shell tùy chỉnh và các alias tiện lợi, mỗi loại đều có vai trò và cơ chế riêng. Nắm vững thứ tự ưu tiên của shell và cách thức tìm kiếm lệnh không chỉ giúp bạn sử dụng Linux hiệu quả hơn mà còn hỗ trợ việc khắc phục sự cố và tùy chỉnh môi trường làm việc của mình. Hãy tiếp tục khám phá và thử nghiệm để biến những kiến thức này thành kinh nghiệm thực tiễn.

Hãy chia sẻ ý kiến hoặc những mẹo thú vị của bạn về cách bạn quản lý và sử dụng các loại lệnh Linux trong công việc hàng ngày của mình!

Related posts

Tại Sao Neovim Là Trình Soạn Thảo Văn Bản Tối Ưu Cho Mọi Lập Trình Viên?

Administrator

Hướng Dẫn Hẹn Giờ Tắt Máy Mac Tự Động Với Phím Tắt và Ứng Dụng Bên Thứ Ba

Administrator

6 Bí Quyết Giúp Bạn Tập Trung Làm Việc Hiệu Quả và Tăng Năng Suất Vượt Trội

Administrator

Leave a Comment