Sprawdź zależności skryptu bash / shell

13

Czy istnieje metoda / polecenie sprawdzające zależności skryptu bash? Innymi słowy, odpowiedź na to pytanie: Które biblioteki powinien zainstalować użytkownik, aby uruchomić skrypt?

Mogę to zrobić ręcznie, czytając skrypt i sprawdzając, jakie inne biblioteki / polecenia wywołuje, ale nie jest to widoczne w przypadku długich skryptów.

4m1nh4j1
źródło

Odpowiedzi:

8

Do tego przyzwyczaił się niesamowicie tajemniczy system automatycznej konfiguracji

tworzyć skrypty powłoki, aby automatycznie konfigurować pakiety kodu źródłowego oprogramowania. Te skrypty mogą dostosowywać pakiety do wielu rodzajów systemów typu UNIX bez ręcznej interwencji użytkownika. Autoconf tworzy skrypt konfiguracyjny dla pakietu z pliku szablonu zawierającego listę funkcji systemu operacyjnego, z których pakiet może korzystać, w postaci wywołań makr M4.

Jeśli nie jest to wystarczająco przerażające, poczekaj, aż spróbujesz napisać swój pierwszy skrypt autoconf. Autorzy autoconf nie wstydzą się jego trudności :

Ci, którzy nie rozumieją Autoconf, są skazani na jego ponowne wynalezienie, słabo. Podstawowym celem Autoconf jest ułatwienie życia użytkownika; ułatwienie życia opiekuna jest jedynie drugorzędnym celem. Innymi słowy, głównym celem nie jest automatyczne generowanie programu config dla opiekunów pakietów; celem jest raczej skonfigurowanie bezbolesnego, przenośnego i przewidywalnego dla użytkownika końcowego każdego automatycznie skonfiskowanego pakietu. I do tego stopnia, że ​​Autoconf odnosi duży sukces - większość skarg na listę Autoconf dotyczy trudności w pisaniu danych wejściowych Autoconf, a nie w zachowaniu wynikowej konfiguracji.

Z drugiej strony wyjdziesz z tego procesu, wiedząc więcej o dziwacznych kawałkach różnych systemów, niż kiedykolwiek sobie wyobrażałeś.

Obecnie osobiście uważam, że moim celem była znacznie bardziej standardowa dystrybucja Debiana i nie zmuszałam się do pisania kolejnego skryptu autoconf. Mam szczęście, że mogę wybrać ten luksus; możesz nie mieć takiej szerokości geograficznej.

msw
źródło
3

To nie jest proste zadanie do zautomatyzowania, ponieważ skrypt może wykorzystywać konstrukty, które pokonują analizę statyczną. Jeśli kiedykolwiek użyje evaljakiegokolwiek prefiksu, takiego jak timelub nice, nie będzie tak proste, jak uruchomienie czegoś takiego jak egrep -o '^[^ ]+ ? 'uzyskanie poleceń i uruchomienie ich za pomocą whichlub type.

Ostatecznie jedynym sposobem na absolutną pewność jest uruchomienie skryptu i sprawdzenie, co się nie powiedzie. Jeśli skrypt jest dobrze napisany, przed uruchomieniem sprawdzi niestandardowe polecenia. Jeśli nie, jedyną drogą do pewności jest próba i błąd.

Powiedziawszy to, coś takiego może pomóc:

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

Dane wyjściowe będą wyglądać następująco:

$ ./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
źródło