2010-09-08 28 views
43

Có trình kiểm tra shell (cụ thể bash hoặc ksh) nào kiểm tra các kịch bản lệnh shell cho kiểu dáng, thực tiễn tốt nhất, quy ước đặt tên, v.v. không? (Một cái gì đó giống như Lint cho C, hoặc Perl :: Critic cho Perl.)Có một công cụ phân tích tĩnh như Lint hay Perl :: Critic cho shell script không?

Tôi biết với ksh bạn có thể thực hiện kiểm tra cú pháp bằng cách chạy ksh -n script.ksh nhưng tôi đã hy vọng điều gì đó không chỉ là kiểm tra sytax - cái gì phân tích cú pháp/phân tích mã thực tế?

Tôi có thể không may mắn, nhưng tôi đoán nó không gây hại khi hỏi.

Trả lời

30

Dự án Debian và Ubuntu sử dụng tập lệnh checkbashisms, tìm kiếm các mẫu cụ thể có thể cho biết ai đó đang dựa vào /bin/shbash.

Ngoài ra, hầu hết các vỏ có tùy chọn -n để phân tích cú pháp và báo cáo lỗi. Bạn có thể kiểm tra kịch bản của bạn chống lại vỏ khác nhau để đảm bảo nó sử dụng cú pháp chỉ cầm tay:

for shell in zsh ksh bash dash sh 
do 
    echo "Testing ${shell}" 
    ${shell} -n my_script.sh 
done 

chỉnh sửa để thêm: Kể từ khi viết câu trả lời này, shellcheck đã được viết, theo đề nghị in a later answer. Điều này thực hiện một công việc toàn diện hơn về các kịch bản shell linting so với các đề xuất trước đó.

+0

Tuyệt vời - tập lệnh đó trông đầy hứa hẹn! Và xét đoán bởi sự thiếu của tôi về việc tìm kiếm bất cứ điều gì khác, và sự thiếu phản ứng, tôi muốn nói đó có lẽ là điều duy nhất hiện có mà làm điều này. Cảm ơn rất nhiều! – BrianH

+1

Có phải tôi hoặc tùy chọn này không có trong trang người đàn ông của bash hay zsh? – log0

+1

'bash -n' giống như' set -n'. – fossilet

37

I found shellcheck: nó kiểm tra các lỗi phổ biến trong trích dẫn và những thứ khác bạn bỏ qua ("vì nó hoạt động").

+1

Nó quá tệ, nó phụ thuộc vào Haskell. Thật tuyệt, nhưng haskell là một sự phụ thuộc rất lớn. –

+2

@Shurane - sự phụ thuộc chỉ cần thiết cho việc xây dựng, không phải để chạy tệp thi hành. –

+2

Có vẻ như phụ thuộc duy nhất là trình duyệt. – msanford

7

Tôi đã viết shlint để bọc checkbashims và các tùy chọn linting cơ bản khác có sẵn cho vỏ được trình bày trong câu trả lời của Brian.

Nó có thể cài đặt thông qua rubygems (gem install shlint) như một loại gag, thực sự, nhưng bạn chỉ cần perl (cho checkbashims) và một vỏ tuân thủ POSIX để giải thích lệnh shlint chính nó. Nên làm việc ra khỏi hộp trên OSX và Ubuntu.

Các vấn đề liên quan