Bash script block 01: Thiết lập cơ bản ban đầu

Lưu ý: Thông tin dưới đây chủ yếu dùng để tôi xem lại, không phải tập trung vào việc hướng dẫn sử dụng bash script, nếu ai thấy nó hữu ích, thì đó chỉ là mục đích phụ.

Để chuẩn hóa Bash script cài WordPress trên Caddy Web Server, tôi xây dựng & kiểm tra lại các khối lệnh trong Bash tổng thể. Việc chia nhỏ và hiểu rõ hơn từng khối sẽ giúp dễ phát hiện lỗi (nếu có) & nâng cấp thêm sau này (một việc quan trọng) vì các gói liên quan cập nhật thường xuyên (không có hy vọng làm một bash script và cứ để đấy để nó chạy được hết năm này qua năm khác).

Bash script được đẩy lên Github, tiện lấy link để chạy qua VPS.

#!/bin/bash

# Dừng script ngay lập tức nếu có lệnh bị lỗi
set -euo pipefail

# Chạy lệnh
# curl -sL https://raw.githubusercontent.com/kiencang/wpsila/refs/heads/main/install_caddy.sh | bash

# Màu sắc cho thông báo
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

a. #!/bin/bash

Khai báo đặt ngay vị trí đầu tiên trong bash script, phải có để Linux hiểu nó sắp nhận được lệnh thực thi (#!) và sử dụng trình thông dịch gì để thông dịch (bin/bash chỉ đến Bash [Bourne Again SHell]).

b. set -euo pipefail

Một tổ hợp lệnh kết hợp để phòng chống lỗi cho bash script. Hiểu rõ cái này thì cần nhiều kinh nghiệm hơn!

Lệnh đơn giản hơn để phòng lỗi là set -e. Tuy nhiên dùng tổ hợp trên sẽ mạnh hơn.

c. #chạy lệnh và các dòng đằng sau

Chỉ là một chú thích đặt ngay gần đầu để mỗi khi chạy lệnh tiện copy. Khi terminal VPS, thường dưới vai trò root tôi chỉ việc paste nó vào và enter.

Câu lệnh để chạy trong ví dụ trên là:

curl -sL https://raw.githubusercontent.com/kiencang/wpsila/refs/heads/main/install_caddy.sh | bash

Trong đó:

  • curl: viết tắt của client URL, tức là sẽ tải lệnh về qua một URL
  • -s: viết tắt của silent (im lặng), để nó không hiện thanh tiến trình tải về, giúp cho màn hình thông báo thoáng hơn.
  • -L: để nó tự động chuyển hướng nếu URL trong lệnh chuyển hướng đến một link khác
  • URL: cụ thể ở đây là https://raw.githubuser…install_caddy.sh, là đường dẫn trực tiếp đến nội dung thô (raw) của file script.
  • bash: trình thông dịch lệnh, nhận và thực thi từng dòng lệnh như thể chúng ta đang gõ lệnh trực tiếp từ máy.

d. Mã màu

Một tập hợp lệnh chỉ màu sắc được gói trong các biến, giúp chúng ta tạo màu cho các văn bản nhằm giúp hiển thị trên termnal được rõ ràng hơn. Tại sao nó lại mô tả màu sắc bằng một chuỗi rất kỳ lạ như vậy tạm thời chúng ta không tìm hiểu vội (ai biết CSS là sẽ thấy chúng thật khác với cách định nghĩa màu quen thuộc).

Nói chung trong các mô tả này tôi chỉ tập trung để tìm hiểu căn bản. Việc đi quá sâu sẽ ngợp, tất nhiên ai có nhu cầu riêng, tự đào sâu thì cứ tự nhiên.


Viết bash script đúng nhưng chạy lỗi vì nguyên nhân gì?

Tôi mất gần 3 tiếng mới biết lý do! Đó là do cách Windows và Linux xử lý ký tự xuống dòng khác nhau (phải hỏi Gemini mệt nghỉ!).

Bạn sẽ thấy lệnh chạy cứ bị thiếu mất ký tự đầu, chẳng hạn sudo thành udo, và cuối cùng là lỗi.

Chưa nói đến việc chạy script qua file bash, kể cả việc copy và thực hiện nhiều lệnh liên tiếp thế này trên terminal một lúc cũng tiềm ẩn lỗi, ví dụ:

sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload

Cách khắc phục là phải để nó trên cùng một dòng, ví dụ:

sudo ufw allow 80 && sudo ufw allow 443 && sudo ufw reload

hoặc như dưới đây:

sudo ufw allow 80; sudo ufw allow 443; sudo ufw reload

Quay lại vấn đề chính với file bash script, để nó không có lỗi khi biên tập trên Windows cần làm như sau:

  • Sử dụng Notepad++
  • UTF-8 phải là ‘without BOM’ như thế này (trong lựa chọn Encoding):
Không kèm BOM
without BOM

Cuối cùng, và rất quan trọng đó là EOL Conversion:

Chuyển đổi EOL
Chuyển đổi EOL

Edit > EOL Conversion > Unix (LF). Sau đó save để lưu.

EOL là viết tắt của End Of Line. Tùy chọn trên nghĩa là chúng ta sử dụng cách kết thúc dòng của Unix (Linux) chứ không phải kiểu mặc định của Windows.

Viết một bình luận