Kiểm tra phụ thuộc tập lệnh bash / shell


13

Có một phương thức / lệnh để kiểm tra sự phụ thuộc của tập lệnh bash không? Nói cách khác, một câu trả lời cho câu hỏi này: Người dùng nên cài đặt thư viện nào để chạy tập lệnh?

Tôi có thể làm điều này bằng tay bằng cách đọc tập lệnh và kiểm tra những thư viện / lệnh khác mà nó gọi nhưng điều này không rõ ràng đối với các tập lệnh dài.

Câu trả lời:


8

Hệ thống autoconf cực kỳ phức tạp đã được sử dụng để

sản xuất các kịch bản shell để tự động cấu hình các gói mã nguồn phần mềm. Các tập lệnh này có thể điều chỉnh các gói cho nhiều loại hệ thống giống như UNIX mà không cần sự can thiệp của người dùng thủ công. Autoconf tạo tập lệnh cấu hình cho gói từ tệp mẫu liệt kê các tính năng của hệ điều hành mà gói có thể sử dụng, dưới dạng các cuộc gọi macro M4.

Nếu điều đó không đủ đáng sợ, hãy đợi cho đến khi bạn cố gắng viết tập lệnh autoconf đầu tiên của mình. Các tác giả của autoconf không ngại về độ khó của nó :

Những người không hiểu Autoconf bị kết án để phát minh lại nó, thật tội nghiệp. Mục tiêu chính của Autoconf là làm cho cuộc sống của người dùng dễ dàng hơn; làm cho cuộc sống của người bảo trì dễ dàng hơn chỉ là một mục tiêu phụ. Nói cách khác, mục tiêu chính là không tạo ra cấu hình tự động cho các nhà bảo trì gói; thay vào đó, mục tiêu là làm cho cấu hình không đau, di động và có thể dự đoán được cho người dùng cuối của mỗi gói được tự động xác định. Và ở mức độ này, Autoconf rất thành công với mục tiêu của nó - hầu hết các khiếu nại đối với danh sách Autoconf là về những khó khăn khi viết đầu vào Autoconf, và không phải trong hành vi cấu hình kết quả.

Mặt khác, bạn sẽ ra khỏi quá trình biết nhiều hơn về các bit khó hiểu của các hệ thống khác nhau mà bạn từng tưởng tượng tồn tại.

Ngày nay, cá nhân tôi, tôi cho rằng một bản phân phối Debian-ish chuẩn hơn nhiều là mục tiêu của tôi và không khiến tôi phải viết một tập lệnh autoconf khác. Tôi may mắn có được sự sang trọng để lựa chọn điều đó; bạn có thể không có vĩ độ như vậy.


3

Đây không phải là một nhiệm vụ đơn giản để tự động hóa, bởi vì một tập lệnh có thể sử dụng các cấu trúc đánh bại phân tích tĩnh. Nếu nó từng sử dụng evalhoặc bất kỳ tiền tố nào như timehoặc nice, nó sẽ không đơn giản như chạy một cái gì đó như egrep -o '^[^ ]+ ? 'để nhận lệnh và chạy chúng thông qua whichhoặc type.

Cuối cùng, cách duy nhất để hoàn toàn chắc chắn là chạy tập lệnh và tìm ra những gì thất bại. Nếu một tập lệnh được viết tốt, nó sẽ kiểm tra các lệnh không chuẩn trước khi chạy. Nếu không, thử và sai là cách duy nhất để chắc chắn.

Đã nói rằng, một cái gì đó như thế này có thể giúp:

#!/bin/bash
egrep -o -e '^[^ ]+ ? ' -e '[a-zA-Z0-9]+' "$1" | sort -u | {
    while read line
    do
        if type $line &>/dev/null
        then
            echo "$line found"
        else
            echo "Error: $line not found"
        fi
    done
} | sort

Đầu ra sẽ như sau:

$ ./check i_wonder.sh
cd found
echo found
elif found
else found
Error: abort not found
Error: checkurl not found
Error: cleanup not found
Error: count not found
Error: debug not found
Error: deleteFile not found
Error: die not found
find found
for found
grep found
if found
mv found
readarray found
rm found
shopt found
size found
sleep found
stat found
trap found
unset found
while found
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.