Zsh 1 Trình shell vô đối (Phần 1)

1. Giới thiệu

Zsh là 1 chương trình shell thiết kế để tương tác, đồng thời zsh cũng là 1 ngôn ngữ script mạnh mẽ (scripting language). Zsh được tích hợp rất nhiều tính năng hữu dụng của cả bash, kshtcsh, đồng thời còn cung cấp nhiều tính năng khác. Bài viết này xin giới thiệu 1 số tính năng độc đáo của zsh.

2. Filename generation

Filename generation còn được biết đến với thuật ngữ globbing, là 1 tính năng khá phong phú trong zsh. Tất nhiên, nó chứa tất cả các thứ căn bản:

report_01.png

Khi bạn set option EXTENDEDGLOB, 1 số tính năng sẽ được active. Ví dụ: kí tự ^ sẽ phủ nhận các pattern như bên dưới đây:

report_02.png

Zsh cung cấp 1 biểu thức kiểu <x-y> tương đương với 1 khoảng số nguyên. Cách sử dụng như sau:

report_03.png

Ngoài ra, Zsh cũng cung cấp cho việc xử lý theo kiểu group. Ví dụ:

report_04.png

Zsh cung cấp tính băng loại trừ 1 số file trong khi xử lý bằng cách sử dụng kí tự ~ . Ví dụ: ls *.c~bar.c có nghĩa là liệt kê tất cả các file có phần mở rộng là .c trong thư mục hiện tại, loại trừ file bar.c.

report_05.png

3. File startup

Zsh sẽ đọc command từ 5 file sau đây:

  • $ZDOTDIR/.zshenv
  • $ZDOTDIR/.zprofile
  • $ZDOTDIR/.zshrc
  • $ZDOTDIR/.zlogin
  • $ZDOTDIR/.zlogout

Nếu $ZDOTDIR chưa được set, Zsh sẽ sử dụng giá trị của biến $HOME.

  • ".zshenv" là khởi nguồn cho tất cả các lời gọi (invocations) của shell, trừ khi option -f được thiết lập. File này thường chứa các command để set các đường dẫn chứa các command khác, cộng thêm set giá trị cho các biến môi trường quan trọng. ".zshenv" không nên chứa các command có đưa ra output hoặc các shell gắn với tty.

  • ".zshrc" là khởi nguồn cho các shell tương tác (interactive shell). File này thường chứa các command để thiết lập aliases, functions, options, key bindings, ...*.

  • ".zlogin" là khởi nguồn của tất cả các login shells. File này thường chứa các command chỉ được thực thi trong login shells.

  • ".zlogout" là file được khởi động khi thoát các login shells.

  • ".zprofile" cũng giống như ".zlogin", ngoại trừ việc file này được khởi động trước file ".zshrc". ".zprofile" được sử dụng như 1 lựa chọn thay thế cho ".zlogin" cho những người thích sử dụng ksh.

Trong ".zlogin" thường không đặt các định nghĩa của alias, options, biến môi trường .... Cũng giống như các luật chung, file này không nên chứa các command có thể làm thay đổi môi trường shell. ".zlogin" thường chứa các command để thiết lập terminal type và chạy các command ngoài (external commands).

4. Shell function

Zsh cũng cho phép bạn tạo các command bằng cách định nghĩa các shell function. Ví dụ:

report_06.png

Note: Các aliases được khai triển khi function được phân tích, không phải khi function được thực thi.

report_07.png

Vì vậy, để có thể chạy alias trong function của bạn, bạn phải định nghĩa alias trước khi định nghĩa funtion.

Zsh cũng cho phép chúng ta tạo 1 function với nhiều tham số.

report_08.png

Vòng lặp for i sẽ chạy qua tất cả các tham số truyền vào của function, thiết lập biến $i qua mỗi lần chạy tương ứng với giá trị của tham số truyền vào theo thứ tự.

Chúng ta cũng có tạo 1 function sẽ thực thi khi mà không có tham số truyền vào. Zsh cung cấp biến $# có giá trị là số lượng tham số truyền vào của function.

report_09.png

Ngoài ra, zsh còn có 1 đặc điểm khác là: Thay vì định nghĩa nhiều functions trong file ".zshrc", không phải tất cả những function ấy đếu được sử dụng, đôi khi tốt hơn nên sử dụng autoload. Ý tưởng là: bạn tạo 1 thư mục lưu trữ các functions mà bạn định nghĩa, khai báo tên của thư mục trong file ".zshrc" và cho shell biết chỗ nào có thể tìm thấy chúng. Khi mà bạn tham chiếu đến 1 function, shell sẽ từ động load function ấy vào bộ nhớ.

report_10.png

Ý tưởng trên còn có nhiều lợi ích khác. Bằng cách thêm kí tự #! ở đầu file, chúng ta có thể chạy chúng như 1 file shell script. Khi đó, những ai không sử dụng zsh, hoặc không muốn copy file ".zshrc" của bạn cũng có thể sử dụng các functions trên như là các file shell scripts.

5. Directory

1 trong những tính năng rất tốt của zsh là tính năng hiển thị tên thư mục.

report_11.png

Shell sẽ hiển thị ra thư mục hiện tại, trong đó dấu ~ là biểu tượng cho thư mục /home/username của bạn. Tuy nhiên zsh thông minh hơn các shell khác ở phương diện sau:

report_12.png

  • Bạn có thể thiết lập giá trị cho 1 biến bằng đường dẫn của 1 folder. Trong ví dụ ở trên, tôi đã đặt biến download_folder bằng thư mục /home/framgia/Downloads. Sau đó, chúng ta có thể truy cập nhanh chóng vào thư mục /home/framgia/Downloads nhanh chóng thông qua biến download_folder. Điều này rất tiện ích cho bạn. Giả sử như bạn đang tham gia vào nhiều project khác nhau. Thông thường, để truy cập vào mỗi thư mục của project, bạn hiện phải thực hiện lệnh cd và gõ các đường dẫn tương đối hoặc đường dẫn tuyệt đối. Khi sử dụng zsh, bạn chỉ cần thiết lập giá trị mỗi biến là giá trị đường dẫn đến thư mục chứa project, sau đó, ở bất cứ vị trí nào, bạn cũng có thể nhanh chóng truy cập đến thư mục của project mà không cần phải gõ dài dòng.

6. Directory stacks

Nếu bạn sử dụng csh, bạn sẽ biết về directory stacks. Về cơ bản, Directory stacks là 1 stack để lưu trữ các thư mục. Để tương tác với Directory stacks, bạn sử dụng lệnh pushd để thêm 1 thư mục vào trong stack và chuyển tới thư mục mới, lệnh popd lấy 1 thư mục ra khỏi stack và chuyển tới thư mục đó. Lệnh dirs hiển thị tất cả các thư mục có trong directory stacks.

report_13.png

Bạn có thể truy cập vào Directory stack để tìm hiểu thêm về Directory stack.

Trong phần tiếp theo, tôi sẽ giới thiệu với các bạn về Command/Process Substitution, Aliasing, History, Command Line Editing, ... trong zsh.

Cảm ơn các bạn đã theo dõi!

Tài liệu tham khảo

An introduction to the Z Shell