Проверьте зависимости скриптов bash / shell

13

Есть ли метод / команда для проверки зависимостей bash-скрипта? Другими словами, ответ на этот вопрос: какие библиотеки должен установить пользователь для запуска сценария?

Я могу сделать это вручную, читая скрипт и проверяя, какие другие библиотеки / команды он вызывает, но это не очевидно для длинных скриптов.

4m1nh4j1
источник

Ответы:

8

Невероятно тайная система Autoconf была использована для

создавать сценарии оболочки для автоматической настройки пакетов исходного кода программного обеспечения. Эти сценарии могут адаптировать пакеты для многих типов UNIX-подобных систем без ручного вмешательства пользователя. Autoconf создает сценарий конфигурации для пакета из файла шаблона, в котором перечислены функции операционной системы, которые пакет может использовать, в виде вызовов макросов M4.

Если этого недостаточно, подождите, пока вы не попытаетесь написать свой первый скрипт autoconf. Авторы autoconf не стесняются его сложности :

Те, кто не разбирается в Autoconf, обречены плохо его изобретать. Основная цель Autoconf - облегчить жизнь пользователя; облегчение жизни сопровождающего - это только второстепенная цель. Иными словами, основная цель не состоит в том, чтобы сделать генерацию конфигурации автоматической для сопровождающих пакетов; скорее, цель состоит в том, чтобы сделать настройку безболезненной, переносимой и предсказуемой для конечного пользователя каждого пакета с автоматической конфискацией. И в этом смысле Autoconf очень успешен в достижении своей цели - большинство жалоб в списке Autoconf касаются трудностей при записи ввода Autoconf, а не в поведении получаемой конфигурации.

С другой стороны, вы выйдете из процесса, зная больше о крошечных кусочках различных систем, чем вы когда-либо могли себе представить.

В эти дни я лично предположил, что моей целью было гораздо более стандартное распространение Debian, а не заставлял себя писать еще один скрипт autoconf. Мне повезло, что я выбрал такую ​​роскошь; у вас может не быть такой широты.

MSW
источник
3

Это не простая задача для автоматизации, потому что сценарий может использовать конструкции, которые побеждают статический анализ. Если он когда-либо использует evalили какой-либо префикс, такой как timeили nice, это будет не так просто, как запустить что-то вроде egrep -o '^[^ ]+ ? 'получения команд и выполнить их через whichили type.

В конце концов, единственный способ быть абсолютно уверенным - запустить скрипт и выяснить, что не получается. Если скрипт хорошо написан, он будет проверять наличие нестандартных команд перед запуском. Если нет, то метод проб и ошибок - единственный способ быть уверенным.

Сказав это, что-то вроде этого может помочь:

#!/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

Вывод будет выглядеть так:

$ ./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
blujay
источник