Nhảy tới nội dung

Command và Arguments

BASH đọc các lệnh từ đầu vào của nó (thường là từ terminals hoặc file). Mỗi dòng đầu vào mà nó đọc được sẽ được coi như là một lệnh (command) - một lệnh có thể được thực hiện. (Có một số trường hợp nâng cao, chẳng hạn như các lệnh kéo dài nhiều dòng (multiple lines).)

Bash chia mỗi dòng thành các từ, các từ đó được phân chia bằng ký tự khoảng trắng (dấu cách và tabs). Từ đầu tiên của dòng là tên của lệnh sẽ được thực hiện. Tất cả các từ còn lại trở thành đối số của lệnh đó (tùy chọn, tên tệp, v.v.).

Scripts

Scripts (tập lệnh) về cơ bản là một chuỗi các lệnh trong một tệp. Bash đọc tệp và xử lý các lệnh theo thứ tự. Nó chỉ chuyển sang lệnh tiếp theo khi lệnh hiện tại đã kết thúc. (Ngoại lệ là nếu một lệnh đã được chỉ định để chạy không đồng bộ, trong nền. Đừng lo lắng quá nhiều về trường hợp này - chúng ta sẽ tìm hiểu về cách hoạt động sau này.)

Tạo một script rất dễ dàng. Bắt đầu bằng cách tạo một tệp mới và đặt chuỗi này ở dòng đầu tiên:

#!/bin/bash

Tiêu đề này được gọi là chỉ thị thông dịch (nó còn được gọi là hashbang hoặc shebang). Nó chỉ định rằng /bin/bash sẽ được sử dụng làm trình thông dịch khi file được sử dụng làm file thực thi trong một lệnh. Khi kernel thực thi một tệp không phải file nhị phân, nó sẽ đọc dòng đầu tiên của tệp. Nếu dòng bắt đầu bằng #!, kernel sử dụng dòng này để xác định trình thông dịch để chuyển tiếp tệp tới. (Cũng có những cách hợp lệ khác để thực hiện việc này, xem bên dưới.) Dấu #! phải ở đầu tệp, không có dấu cách hoặc dòng trống trước tệp. Các lệnh trong tập lệnh của chúng ta sẽ xuất hiện trên các dòng riêng biệt bên dưới dòng này.

💡

Thay vì #!/bin/bash, bạn có thể sử dụng: #!/usr/bin/env bash env tìm kiếm $PATH cho tệp thực thi được đặt tên theo đối số đầu tiên của nó (trong trường hợp này là "bash").

⚠️

Đừng để bị lừa bởi các tập lệnh hoặc ví dụ trên Internet sử dụng /bin/sh làm trình thông dịch. Bởi vì sh không phải là bash! Bản thân Bash là một shell "tương thích với sh" (có nghĩa là nó có thể chạy hầu hết các script 'sh' và mang nhiều cú pháp giống nhau) tuy nhiên, điều ngược lại là không đúng; một số tính năng của Bash sẽ phá vỡ hoặc gây ra hành vi không mong muốn trong sh.

Ngoài ra, vui lòng không cho tập lệnh có phần mở rộng .sh. Nó không có mục đích gì và nó hoàn toàn gây hiểu lầm (vì nó sẽ là một tập lệnh bash, không phải là một tập lệnh sh).

Khi tệp script đã được tạo, nó có thể được thực thi bằng cách:

$ bash myscript

Trong ví dụ này, chúng ta sẽ thực thi bash và yêu cầu nó đọc script. Khi chúng ta làm như thế này, dòng #! chỉ là một bình luận, Bash không làm gì cả với nó.

Ngoài ra, chúng ta có thể cấp quyền thực thi các tập lệnh của mình. Với phương pháp này, thay vì gọi Bash theo cách thủ công, chúng ta có thể thực thi tập lệnh dưới dạng một ứng dụng:

$ chmod +x myscript  # Mark the file as executable.
$ ./myscript # Now, myscript can be executed directly instead of having to pass it to bash.

Khi chúng ta chạy lệnh theo cách này, hệ điều hành (OS) sử dụng dấu #! dòng để xác định trình thông dịch sẽ sử dụng.

Để quyết định nơi đặt tập lệnh, có một số lựa chọn thay thế. Nói chung, mọi người thích giữ các tập lệnh của họ trong một thư mục do cá nhân; điều này ngăn không cho tập lệnh của bạn can thiệp vào những người dùng khác trên hệ thống. Một số muốn giữ các tập lệnh của họ trong một thư mục có sẵn trong PATH, bởi vì những người này nghĩ rằng họ sẽ không bao giờ mắc lỗi.

Để sử dụng thư mục cá nhân:

$ mkdir -p "$HOME/bin"
$ echo 'PATH="$HOME/bin:$PATH"' >> "$HOME/.bashrc"
$ source "$HOME/.bashrc"

Lệnh đầu tiên sẽ tạo một thư mục có tên bin bên trong thư mục chính của bạn (thư mục thuộc về cá nhân bạn). Thường thì các thư mục chứa các lệnh được đặt tên là bin, ngay cả khi các lệnh đó là tập lệnh và không phải là chương trình được biên dịch ("file nhị phân"). Lệnh thứ hai sẽ ;à thêm đường dẫn bin mới của ta vào trước các đường dẫn có trong PATH và gán nó lại vào biến PATH. Ta sẽ thêm dòng này vào tệp cấu hình Bash (.bashrc). Bây giờ mọi tương tác mới của Bash giờ đây sẽ kiểm tra các tập lệnh thực thi trong thư mục mới của chúng ta trước khi kiểm tra bất kỳ thư mục nào đã có trong PATH. Lệnh thứ ba yêu cầu Bash đọc lại tệp cấu hình của nó.

Một số người thích sử dụng một thư mục khác để chứa các tập lệnh cá nhân của họ, chẳng hạn như $HOME/.config/bin hoặc $HOME/.local/bin. Bạn có thể sử dụng bất cứ thứ gì bạn thích, miễn là phù hợp.

Các thay đổi đối với tệp cấu hình Bash sẽ không có hiệu lực ngay lập tức; chúng ta phải thực hiện bước đọc lại tệp. Trong ví dụ trên, chúng tôi đã sử dụng source "$HOME/.bashrc". Chúng ta cũng có thể sử dụng lệnh exec bash, hoặc có thể đóng lại terminal hiện có và mở một terminal mới, sau đó, Bash sẽ tự khởi tạo lại bằng cách đọc .bashrc (và có thể là các tệp khác).

Trong mọi trường hợp, chúng ta có thể đặt tập lệnh của mình vào thư mục bin và thực thi nó như một lệnh bình thường - chúng ta không cần thêm tên tập vào sau đường dẫn của tệp (là phần ./ trong ví dụ trước):

$ mv myscript "$HOME/bin"
$ myscript

Cơm thêm:

💡

Nếu hệ thống có nhiều phiên bản bash được cài đặt, việc chỉ định trình thông dịch theo đường dẫn tuyệt đối có thể không đảm bảo sử dụng đúng phiên bản bash. Ví dụ: #!/usr/bin/bash. Gõ "type -a bash" để in các đường dẫn đãn đến tất cả tệp thực thi Bash trong PATH.

💡

Trình thông dịch có thể được theo sau bởi một tùy chọn. Ví dụ: các tùy chọn sau sẽ bật debug quá trình chạy: "#!/usr/bin/bash -x". Để tìm hiểu thêm, hãy xem tại mục Debugging