Contents

Zsh so với Bash Scripting. Có gì khác biệt?

Khi nói đến shell script trên các hệ điều hành giống Unix, có hai shell chiếm ưu thế: Bash (Bourne Again Shell) và Zsh (Z Shell). Nếu bạn là lập trình viên hoặc quản trị viên hệ thống, việc lựa chọn giữa hai điều này sẽ ảnh hưởng đáng kể đến hiệu quả và năng suất của bạn.

Hiểu được sự khác biệt và điểm giống nhau giữa hai lớp vỏ này có thể thuận lợi trong việc tối ưu hóa quy trình làm việc dòng lệnh của một người, vì hiểu biết về các đặc điểm cụ thể của chúng cho phép đưa ra những đánh giá sáng suốt.

Bash và Zsh là gì?

Bash, một giao diện dòng lệnh linh hoạt và được sử dụng rộng rãi, cung cấp nhiều chức năng trên nhiều nền tảng khác nhau như hệ thống Linux và macOS. Là một công cụ mạnh mẽ và hiệu quả, nó cho phép người dùng tương tác liền mạch với hệ điều hành của họ trong khi thực hiện nhiều lệnh cùng một lúc. Ngoài ra, khả năng của Bash còn mở rộng ra ngoài các tương tác cơ bản thông qua việc hỗ trợ tập lệnh shell. Bằng cách sử dụng các tập lệnh bao gồm nhiều lệnh, người dùng có thể tự động hóa các tác vụ lặp đi lặp lại hoặc tốn thời gian một cách hiệu quả, từ đó hợp lý hóa các quy trình công việc.

Kết hợp các yếu tố từ cả hệ điều hành Mac và Linux, Zsh là giao diện dòng lệnh linh hoạt và giàu tính năng, đóng vai trò là lớp vỏ tiêu chuẩn cho nền tảng macOS của Apple đồng thời thu hút được sự chú ý giữa các bản phân phối Linux khác nhau.

Cách chuyển từ Bash sang Zsh

Để chuyển đổi liền mạch từ việc sử dụng hệ điều hành Linux sang sử dụng Zsh làm shell mặc định, hãy bắt đầu bằng cách sử dụng trình quản lý gói tương ứng của bản phân phối cho mục đích cài đặt. Để minh họa, nếu bạn đang làm việc với hệ thống dựa trên Debian hoặc Ubuntu, hãy thực thi lệnh sau:

 sudo apt install zsh 

Sau khi cài đặt chương trình trên máy tính, bạn có thể dễ dàng chuyển sang sử dụng chương trình đó bằng cách thực hiện một lệnh cụ thể trong terminal hoặc dấu nhắc lệnh.

 chsh -s $(which zsh) 

Để chuyển sang shell Zsh trên hệ điều hành Mac, hãy thực hiện lệnh sau trong terminal của bạn:

 chsh -s /bin/zsh 

Để quay lại sử dụng shell Bash thay vì Zsh, chỉ cần sửa đổi các lệnh được cung cấp trước đó bằng cách thay thế “Zsh” bằng “Bash”.

Để xác định shell hiện tại đang được sử dụng, hãy thực hiện lệnh tiếp theo:

 echo $SHELL 

Việc kết hợp việc sử dụng biện pháp xác nhận có thể hỗ trợ xác nhận rằng người dùng đang sử dụng môi trường hoạt động mong muốn, từ đó thúc đẩy sự đảm bảo cao hơn về lựa chọn được thực hiện.

Sự khác biệt giữa Zsh và Bash

Việc kiểm tra sự khác biệt giữa Zsh và Bash là điều cần thiết trong việc xác định shell nào trong số này phù hợp với sở thích và yêu cầu của bạn.

Tùy chỉnh nhắc nhở

Zsh cung cấp một phương pháp thuận tiện để cá nhân hóa giao diện dòng lệnh của bạn bằng cách sử dụng các chuỗi thoát dựa trên phần trăm trong dấu nhắc chính, ký hiệu là PS1. Bằng cách sử dụng phương pháp này, có thể tạo ra những lời nhắc mang tính thông tin và hấp dẫn về mặt trực quan kết hợp các yếu tố như màu sắc và nội dung được tạo động. Để điều chỉnh giao diện của dấu nhắc shell, trước tiên bạn phải thiết lập cấu hình mong muốn bằng cách xác định biến PS1.

 PS1="%F{green}%n@%m %F{blue}%~ %f$ "

Lời nhắc tùy chỉnh nói trên hiển thị biệt danh, tên miền và thư mục làm việc hiện tại của người dùng thông qua các chỉ báo trực quan có nhiều màu sắc khác nhau:

/vi/images/what-is-the-difference-zsh-vs-bash-scripting-in-the-terminal-prompt-customization.jpg

Ngoài ra, tồn tại vô số phương pháp để cá nhân hóa lời nhắc Zsh, cho phép một phương pháp hiển thị chỉ dẫn quản trị, kết hợp ngày giờ hiện tại và duy trì mọi sửa đổi được thực hiện đối với lời nhắc cập nhật.

Bash sử dụng một chiến lược thay thế để cá nhân hóa nhanh chóng so với Zsh. Việc sử dụng mã thoát cho phép tùy chỉnh màu sắc và định dạng trong lời nhắc. Để đạt được mức độ điều chỉnh tương tự như ví dụ của Zsh, người ta có thể sử dụng mẫu lời nhắc tùy chỉnh sau:

 PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "

Việc sử dụng \\[\033[0m\\] là điều cần thiết, vì nó đảm bảo rằng mọi sửa đổi về màu sắc sẽ không ảnh hưởng đến văn bản tiếp theo trong lệnh hoặc tin nhắn.

Hỗ trợ mảng kết hợp

Zsh, là ngôn ngữ lập trình bản địa trong các hệ thống giống Unix, vốn thừa nhận khái niệm về mảng kết hợp. Mảng kết hợp về cơ bản là tập hợp các cặp khóa-giá trị tạo điều kiện thuận lợi cho việc tổ chức và truy xuất thông tin một cách dễ dàng nhất. Để tạo một mảng kết hợp, người ta có thể sử dụng từ khóa “khai báo” theo sau là “-A” để khai báo rõ ràng sự tồn tại của nó.

 # Declare an associative array in Zsh
 declare -A my_assoc_array 

Người ta có thể thêm mảng kết hợp với các giá trị được gán sau đó.

 my_assoc_array=(key1 value1 key2 value2)

Để truy xuất các giá trị được liên kết với khóa của từ điển, người ta có thể sử dụng tính năng lập chỉ mục để tham chiếu trực tiếp và truy cập các giá trị đó. Quá trình này bao gồm việc chỉ định khóa quan tâm và sử dụng nó làm chỉ mục để thu được giá trị tương ứng của nó trong từ điển.

 echo $my_assoc_array[key1] # Outputs: value1 

Bash cung cấp hỗ trợ riêng cho các mảng kết hợp bắt đầu từ phiên bản 4. Quá trình khai báo và gán giá trị tương tự như trong Zsh. Tuy nhiên, khi truy xuất các phần tử mảng, người ta phải đặt chỉ mục trong dấu ngoặc nhọn {}.

 echo "${my_assoc_array[key1]}"

Một điểm khác biệt đáng chú ý giữa Zsh và Bash nằm ở khả năng tương ứng của chúng đối với mảng kết hợp. Mặc dù cả hai shell đều cung cấp chức năng như vậy nhưng Zsh cung cấp một bộ tính năng toàn diện hơn cho các cấu trúc dữ liệu này. Cụ thể, Zsh cho phép các mảng kết hợp với các giá trị khóa của các loại dữ liệu đa dạng ngoài các chuỗi văn bản đơn giản; trong khi đó, Bash hạn chế các khóa của nó chỉ bao gồm các phần tử chuỗi.

Trong các phiên bản trước của ngôn ngữ lập trình Bash, việc sử dụng mảng kết hợp đòi hỏi phải triển khai các giải pháp thay thế hoặc sử dụng các công cụ bên ngoài.

Mẫu hình cầu mở rộng

Các mẫu toàn cầu mở rộng cung cấp một phương pháp mạnh mẽ và linh hoạt để chọn và thao tác các tệp và thư mục theo nhiều tiêu chí, khiến chúng đặc biệt có lợi trong các tình huống liên quan đến cấu trúc thư mục phức tạp hoặc yêu cầu mức độ chi tiết trong việc lựa chọn tệp.

Để kích hoạt các tiêu chí khớp mẫu cụ thể trong tập lệnh Zsh bằng cách sử dụng lệnh setopt, người ta có thể chỉ định một phần mở rộng tệp cụ thể mà bạn quan tâm cho thư mục làm việc hiện tại. Để đạt được mục tiêu này, chỉ cần thực thi lệnh setopt theo sau là phần mở rộng tệp mong muốn, chẳng hạn như .txt , từ đó cho phép nhận dạng và xử lý các tệp văn bản có hậu tố đó trong ngữ cảnh thư mục hiện tại.

 setopt extended_glob
txt_files=(*.txt)

“.jpg-không phải *.log”. Thao tác này sẽ chọn tất cả các tệp có phần mở rộng tệp “.jpg” hoặc “.jpeg” và không có phần mở rộng “.log” phù hợp.

 setopt extended_glob
non_log_files=^(*.log)

Để sử dụng các mẫu hình cầu mở rộng trong shell Bash, người ta phải kích hoạt tính năng này bằng cách sử dụng lệnh “shopt” cùng với tùy chọn “extglob”. Để minh họa, nếu một người muốn xác định và xử lý tất cả các tệp kết thúc bằng “.txt” nằm trong thư mục làm việc hiện tại, họ sẽ nhập mã sau:

 shopt -s extglob
txt_files=(*.txt)

Để loại trừ các tệp có phần mở rộng tệp “.log” khỏi bị khớp, bạn có thể sử dụng mẫu biểu thức chính quy sau trong lệnh grep của mình:css[^.]\*\.log$Điều này sẽ tìm kiếm bất kỳ chuỗi nào không bắt đầu bằng dấu chấm (tức là tên tệp không kết thúc bằng “.log”), theo sau là “\.log”. Điều này khớp với bất kỳ chuỗi ký tự con nào kết thúc bằng “.log”, bao gồm hầu hết các tệp nhật ký nhưng loại trừ các loại tệp văn bản hoặc thư mục khác.

 shopt -s extglob
non_log_files=!(*.log) 

Về mặt khớp mẫu toàn cầu, có một điểm khác biệt chính giữa Zsh và Bash liên quan đến các lệnh tương ứng được sử dụng để kích hoạt các mẫu này. Tuy nhiên, cần lưu ý rằng các toán tử nhất định được sử dụng bởi mỗi shell có thể khác nhau.

Mở rộng tham số nâng cao

Zsh cung cấp khả năng mở rộng tham số gián tiếp, cho phép đánh giá một biến có tên được chứa trong một biến khác. Để thực hiện thao tác này, trước tên biến phải có dấu chấm than, ký hiệu là “!”.

 name="foo"
result="${!name}"
echo "$result"

Bash vốn không hỗ trợ việc mở rộng biến gián tiếp. Tuy nhiên, vẫn có những cách giải quyết khác như sử dụng lệnh tích hợp eval hoặc sử dụng cú pháp ${!variable} để đạt được tham chiếu gián tiếp của các biến.

 name="world"
var="name"
echo ${!var} # This will output: world

Điểm tương đồng giữa Bash và Zsh

Bất chấp sự khác biệt tồn tại giữa Bash và Zsh, chúng ta cũng có thể nhận thấy một số điểm chung nhất định giữa chúng.

Cú pháp dòng lệnh

Bash và Zsh sử dụng cấu trúc tương tự cho giao diện dòng lệnh của chúng, tạo điều kiện cho khả năng tương tác liền mạch giữa chúng. Do đó, phần lớn các lệnh và trình tự theo kịch bản có thể được thực thi trong cả hai shell mà không cần điều chỉnh. Việc Zsh được xây dựng dựa trên nền tảng của Bash ngụ ý rằng nó kết hợp tất cả các khả năng và chức năng cơ bản.

Mặc dù có thể có một số khác biệt nhỏ trong cấu trúc ngữ pháp cần được chú ý nhưng điều quan trọng là phải xem xét cẩn thận và giải quyết chúng cho phù hợp.

Tính nhất quán của việc thay thế lệnh

Thay thế lệnh là một kỹ thuật được sử dụng để thực thi các lệnh trong đó kết quả hoặc đầu ra của một lệnh được kết hợp làm đối số trong lệnh khác, đảm bảo tính đồng nhất trên các môi trường shell khác nhau.

 result=$(ls)

Cả Bash và Zsh đều cung cấp chức năng tương tự bằng cách cho phép sử dụng cú pháp $(command), cho phép thay thế đầu ra từ một lệnh thành một biến. Tính năng này tạo điều kiện cho khả năng tương tác liền mạch giữa hai loại shell trong khi vẫn duy trì khả năng tương thích tập lệnh trên các nền tảng khác nhau.

Tùy chọn gỡ lỗi tập lệnh

Cả Bash và Zsh đều sử dụng cờ -x để hỗ trợ việc gỡ lỗi tập lệnh. Bằng cách thực thi tập lệnh bằng cờ này, nó sẽ hiển thị từng lệnh trước khi thực thi. Điều này cho phép người dùng phát hiện bất kỳ sự khác biệt nào trong tập lệnh của họ.

 # Debugging a script in both Bash and Zsh
#!/bin/bash -x

echo "Debugging Bash script"

Việc sử dụng cờ -x trong tập lệnh Bash này nhằm tạo điều kiện thuận lợi cho các hoạt động gỡ lỗi. Chức năng này cũng có thể được sao chép trong ngữ cảnh Zsh bằng cách thay thế bash bằng zsh , từ đó kết hợp các lợi ích của nó vào môi trường shell sau.

Những cân nhắc khi lựa chọn giữa Zsh và Bash

Sự phổ biến của Bash với tư cách là lớp vỏ mặc định trên nhiều nền tảng dựa trên Unix mang lại cho nó mức độ tương thích và khả năng vận chuyển cao hơn, khiến nó trở thành một lựa chọn an toàn hơn cho các nỗ lực viết kịch bản đa hệ thống đòi hỏi phải sửa đổi tối thiểu trên các kiến ​​trúc phần cứng khác nhau.

Zsh cung cấp một loạt các khả năng phức tạp như mảng kết hợp, mẫu hình cầu nâng cao và các tùy chọn mở rộng tham số phức tạp giúp đơn giản hóa các quy trình tạo tập lệnh cấp cao. Các thuộc tính này đặc biệt có lợi cho những người yêu cầu xử lý chuỗi vượt trội và độ phức tạp về cấu trúc trong tập lệnh của họ.

Shell Bash và Zsh đều tự hào về cộng đồng thịnh vượng, tuy nhiên Zsh sở hữu một cộng đồng mạnh mẽ hơn và một loạt các plugin và chủ đề mở rộng để lựa chọn. Đối với những người ưu tiên cá nhân hóa, điều này có thể mang lại lợi ích đáng kể cho Zsh.

Bash, là một shell trực quan và được sử dụng rộng rãi, đóng vai trò như một lối vào dễ tiếp cận cho những người không quen với shell script. Tài liệu phong phú và tài liệu dành cho người mới bắt đầu giúp đơn giản hóa quá trình nắm bắt các khái niệm cơ bản trong lĩnh vực này.

Tự động hóa tác vụ bằng Shell Script

Việc sử dụng khéo léo các ngôn ngữ tập lệnh để hợp lý hóa các quy trình thông qua việc triển khai các tập lệnh shell có giá trị đáng kể. Bằng cách cơ giới hóa các nhiệm vụ định kỳ, một lượng thời gian đáng kể có thể được tiết kiệm.

Ngoài việc quản lý tài khoản người dùng, giám sát tài nguyên hệ thống, sao lưu dữ liệu và thực hiện bảo trì định kỳ, các tập lệnh này có thể được sử dụng để giảm thiểu khả năng con người giám sát.