Verifique as dependências do script bash / shell

13

Existe um método / comando para verificar as dependências de um script bash? Em outras palavras, uma resposta a esta pergunta: Quais bibliotecas um usuário deve instalar para executar o script?

Eu posso fazer isso manualmente lendo o script e verificando o que outras bibliotecas / comandos chama, mas isso não é evidente para scripts longos.

4m1nh4j1
fonte

Respostas:

8

O sistema autoconf incrivelmente misterioso foi usado para

produza shell scripts para configurar automaticamente os pacotes de código-fonte do software. Esses scripts podem adaptar os pacotes a vários tipos de sistemas UNIX, sem intervenção manual do usuário. O Autoconf cria um script de configuração para um pacote a partir de um arquivo de modelo que lista os recursos do sistema operacional que o pacote pode usar, na forma de chamadas de macro M4.

Se isso não for suficientemente assustador, aguarde até tentar escrever seu primeiro script de autoconf. Os autores do autoconf não têm vergonha de sua dificuldade :

Quem não entende o Autoconf está condenado a reinventá-lo, mal. O objetivo principal do Autoconf é facilitar a vida do usuário; facilitar a vida do mantenedor é apenas um objetivo secundário. Em outras palavras, o objetivo principal não é tornar a geração de configuração automática para mantenedores de pacotes; em vez disso, o objetivo é tornar a configuração indolor, portátil e previsível para o usuário final de cada pacote confiscado automaticamente. E, nesse nível, o Autoconf é altamente bem-sucedido em seu objetivo - a maioria das reclamações na lista do Autoconf são sobre dificuldades em escrever a entrada do Autoconf e não no comportamento da configuração resultante.

Por outro lado, você sairá do processo sabendo mais sobre os bits complicados de vários sistemas do que você jamais imaginou existir.

Hoje em dia, pessoalmente, eu assumiria que uma distribuição Debian-ish muito mais padrão era meu alvo e não me obrigaria a escrever outro script de autoconf. Tenho sorte de ter o luxo de escolher isso; você pode não ter essa latitude.

msw
fonte
3

Essa não é uma tarefa simples de automatizar, porque um script pode usar construções que anulam a análise estática. Se ele usar evalalgum prefixo como timeou nice, não será tão simples quanto executar algo como egrep -o '^[^ ]+ ? 'obter comandos e executá-los através de whichou type.

No final, a única maneira de ter certeza absoluta é executar o script e descobrir o que falha. Se um script estiver bem escrito, ele verificará comandos não padrão antes da execução. Caso contrário, a tentativa e erro é a única maneira de ter certeza.

Dito isto, algo como isto poderia ajudar:

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

A saída será semelhante a:

$ ./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
fonte