ShellCheck là công cụ phân tích tĩnh hiển thị cảnh báo và gợi ý về code xấu trong shell script bash/sh. Nó có thể dùng theo nhiều cách: từ web bằng cách dán shell script vào trình soạn thảo trực tuyến (Ace – trình soạn thảo code độc lập viết bằng JavaScript) tại https://www.shellcheck.net (luôn đồng bộ với commit git mới nhất, và là cách đơn giản nhất để dùng ShellCheck) để có phản hồi tức thì.
Thay vào đó, bạn có thể cài đặt nó trên máy và chạy từ terminal, tích hợp với trình soạn thảo văn bản cũng như trong quy trình build hoặc test suite.
Có ba việc chính ShellCheck làm:
- Chỉ ra và giải thích các vấn đề cú pháp điển hình của người mới bắt đầu khiến shell đưa ra thông báo lỗi khó hiểu.
- Chỉ ra và giải thích các vấn đề ngữ nghĩa cấp trung cấp khiến shell hành xử kỳ lạ và phản trực giác.
- Chỉ ra các lưu ý tinh vi, trường hợp góc và bẫy có thể khiến script hoạt động tốt của người dùng nâng cao thất bại trong tình huống tương lai.
Trong bài này, chúng tôi sẽ chỉ cách cài đặt và dùng ShellCheck theo các cách khác nhau để tìm bug hoặc code xấu trong shell script của bạn trên Linux.
Cách Cài Đặt Và Sử Dụng ShellCheck Trên Linux
ShellCheck có thể cài đặt dễ dàng cục bộ qua trình quản lý gói như sau.
Trên Debian/Ubuntu
# apt-get install shellcheck
Trên RHEL/CentOS
# yum -y install epel-release # yum install ShellCheck
Trên Fedora
# dnf install ShellCheck
Sau khi cài ShellCheck, hãy xem cách dùng ShellCheck theo các phương pháp đã đề cập.
Dùng ShellCheck Từ Web
Truy cập https://www.shellcheck.net và dán script của bạn vào trình soạn thảo Ace cung cấp, bạn sẽ thấy đầu ra ở dưới cùng trình soạn thảo như ảnh chụp màn hình dưới đây.
Trong ví dụ sau, script shell test bao gồm các dòng sau:
#!/bin/bash #khai báo biến MINARGS=2 E_NOTROOT=50 E_MINARGS=100 #echo giá trị biến echo $MINARGS echo $E_NONROOT exit 0;
Từ ảnh chụp trên, hai biến đầu tiên E_NOTROOT và E_MINARGS đã được khai báo nhưng không dùng, ShellCheck báo cáo đây là „lỗi gợi ý“:
SC2034: E_NOTROOT appears unused. Verify it or export it. SC2034: E_MINARGS appears unused. Verify it or export it.
Thứ hai, tên sai (trong câu lệnh echo $E_NONROOT) được dùng để echo biến E_NOTROOT, đó là lý do ShellCheck hiển thị lỗi:
SC2153: Possible misspelling: E_NONROOT may not be assigned, but E_NOTROOT is
Lại nữa, nhìn các lệnh echo, biến chưa được đặt trong ngoặc kép (giúp ngăn globbing và tách từ), do đó Shell Check hiển thị cảnh báo:
SC2086: Double quote to prevent globbing and word splitting.
Dùng ShellCheck Từ Terminal
Bạn cũng có thể chạy ShellCheck từ dòng lệnh, chúng ta sẽ dùng cùng script shell trên như sau:
$ shellcheck test.sh
Dùng ShellCheck Từ Trình Soạn Thảo Văn Bản
Bạn cũng có thể xem gợi ý và cảnh báo ShellCheck trực tiếp trong nhiều trình soạn thảo, đây có lẽ là cách hiệu quả hơn để dùng ShellCheck, một khi bạn lưu tệp, nó sẽ chỉ ra bất kỳ lỗi nào trong code.
Trong Vim, dùng ALE hoặc Syntastic (chúng ta sẽ dùng cái này):
Bắt đầu bằng cài Pathogen để dễ dàng cài syntastic. Chạy các lệnh dưới để lấy tệp pathogen.vim và các thư mục nó cần:
# mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
Sau đó thêm dòng này vào tệp ~/.vimrc:
execute pathogen#infect()
Sau khi cài pathogen, giờ bạn có thể đặt syntastic vào ~/.vim/bundle như sau:
# cd ~/.vim/bundle && git clone --depth=1 https://github.com/vim-syntastic/syntastic.git
Tiếp theo, đóng vim và khởi động lại để tải lại, sau đó gõ lệnh dưới:
:Helptags
Nếu mọi thứ ổn, bạn nên đã tích hợp ShellCheck với Vim, các ảnh chụp màn hình sau cho thấy cách nó hoạt động với cùng script trên.
Trường hợp bạn gặp lỗi sau các bước trên, có thể bạn chưa cài Pathogen đúng. Làm lại các bước nhưng đảm bảo bạn đã làm:
- Tạo cả hai thư mục ~/.vim/autoload và ~/.vim/bundle.
- Thêm dòng execute pathogen#infect() vào tệp ~/.vimrc.
- Làm git clone syntastic bên trong ~/.vim/bundle.
- Dùng quyền thích hợp để truy cập tất cả thư mục trên.
Bạn cũng có thể dùng các trình soạn thảo khác để kiểm tra code xấu trong shell script như:
- Trong Emacs, dùng Flycheck.
- Trong Sublime, dùng SublimeLinter.
- Trong Atom, dùng Linter.
- Trong hầu hết các trình soạn thảo khác, dùng tương thích lỗi GCC.
Lưu ý: Dùng kho code xấu để thực hiện thêm ShellChecking.
ShellCheck Github Repository: https://github.com/koalaman/shellcheck
Đó là tất cả! Trong bài này, chúng tôi chỉ cách cài đặt và dùng ShellCheck để tìm bug hoặc code xấu trong shell script của bạn trên Linux. Chia sẻ suy nghĩ của bạn với chúng tôi qua phần bình luận bên dưới.
Bạn có biết công cụ tương tự nào khác không? Nếu có, hãy chia sẻ thông tin về chúng trong bình luận nữa.