5 điểm bởi GN⁺ 2023-11-25 | 1 bình luận | Chia sẻ qua WhatsApp

Giới thiệu về ShellCheck

  • ShellCheck là công cụ giúp tìm lỗi trong shell script.
  • Có thể cài đặt trên môi trường cục bộ thông qua cabal, apt, dnf, pkg, brew.
  • Chỉ cần dán script vào, ShellCheck sẽ xuất kết quả phân tích.

Đặc điểm của ShellCheck

  • ShellCheck có thể được sử dụng tự do theo giấy phép GPLv3.
  • Tài liệu được ghi chép trên ShellCheck Wiki, và có thể xem mã nguồn trên GitHub.
  • Đã được đóng gói sẵn trong hầu hết các bản phân phối hoặc trình quản lý gói.
  • Được hỗ trợ như một linter tích hợp trong các trình soạn thảo lớn, và có thể tự động kiểm tra mã trong kho lưu trữ GitHub thông qua CodeClimate, Codacy, CodeFactor.
  • Được viết bằng ngôn ngữ Haskell, phù hợp với những người dùng quan tâm đến ngôn ngữ này.

Lời cảm ơn

  • Gửi lời cảm ơn đặc biệt tới GitHub Sponsors: Gitpod, Mercedes-Benz, BashSupport Pro, per1234, WhitewaterFoundry, cavcrosby, dcminter, photostructure, Cronitor, djdefi, steve-chavez và nhiều hơn nữa.

Ý kiến của GN⁺

  • Điều quan trọng nhất trong bài viết này là ShellCheck là một công cụ hữu ích để tìm lỗi trong shell script.
  • ShellCheck miễn phí, được hỗ trợ trên nhiều nền tảng và trình soạn thảo, đồng thời dễ sử dụng, nên có thể khiến nhiều người thấy hứng thú.
  • Đặc biệt, sự hỗ trợ từ cộng đồng mã nguồn mở và việc được phát triển bằng ngôn ngữ Haskell có thể tạo sức hút với các nhà phát triển phần mềm.

1 bình luận

 
GN⁺ 2023-11-25
Ý kiến Hacker News
  • Những điểm cần lưu ý khi viết script

    • Khuyến nghị dùng tùy chọn -u (nounset) để phát sinh lỗi khi dùng biến chưa được khai báo. Ngoại lệ là khi mở rộng mảng, mảng rỗng có thể bị coi là unbound.
    • Có thể thử chạy giả lập (dry-run) bằng tùy chọn -n (noexec) để ngăn lệnh thực thi.
    • Tùy chọn -e (errexit) cũng hữu ích, nhưng cần lưu ý rằng chỉ các lệnh "trần" bị thất bại mới khiến script thoát. Để tránh điều này, người viết thích thêm || fail "..." vào lệnh.
  • Phát hiện lỗ hổng trong shell script

    • Đã phát hiện lỗ hổng leo thang đặc quyền thông qua mở rộng số học. Ví dụ, nếu có thể kiểm soát $ENV_VAR qua $((1 + ENV_VAR)) thì có thể chèn mã.
    • Shellcheck không phát hiện điều này theo cấu hình mặc định. Khi triển khai chức năng quan trọng về bảo mật, tốt hơn là không nên dùng shell.
  • Shellcheck và strictbash

    • Shellcheck rất hữu ích.
    • strictbash là một wrapper chạy Shellcheck trước khi thực thi script, nên nếu có lỗi thì script sẽ không thể chạy. Nó cũng bật toàn bộ các cờ "strict mode" của Bash.
  • Nhắc đến Shellcheck

    • Có rất nhiều lần nhắc đến Shellcheck, và cuộc thảo luận lớn gần nhất là vào năm 2021.
  • Sử dụng Haskell và Turtle

    • Việc chuyển đổi script triển khai bằng Haskell cùng thư viện Turtle đã giúp giảm đáng kể phần lặp lại.
    • Kết quả là mã ngắn hơn rất nhiều.
  • Sử dụng Shellcheck và các linter

    • Tuân theo nguyên tắc "sửa hết mọi cảnh báo rồi mới commit", đồng thời đưa Shellcheck và các linter khác vào cấu hình pre-commit.
    • Phần lớn shell script nằm trong các tệp .gitlab-ci.yml nên khó kiểm tra. Đã tạo một wrapper để tự động kiểm tra chúng.
  • Bash language server

    • Bash language server cũng tồn tại.
  • Hiệu quả học hỏi từ Shellcheck

    • Khi dùng Shellcheck để kiểm tra script /bin/sh production đầu tiên, dù đã viết script từ những năm 80, người viết vẫn học được điều mới.
  • Khuyến nghị dùng Bach

    • Khi buộc phải dùng Bash, có ý kiến khuyến nghị dùng Bach. Với các tác vụ đủ dài, Bash có thể không phải lựa chọn phù hợp.
  • Shellcheck và xử lý source/import

    • Shellcheck rất tuyệt, nhưng xử lý source hay import thì rất phiền phức. Đây là vấn đề phát sinh vì sh giống như một cơn ác mộng.