Comprobar dependencies de script bash / shell

¿Hay un método / command para verificar las dependencies de un script bash? En otras palabras, una respuesta a esta pregunta: ¿Qué bibliotecas debería instalar un usuario para ejecutar el script?

Puedo hacerlo manualmente leyendo el script y comprobando qué otras bibliotecas / commands llama, pero esto no es evidente para los scripts largos.

El increíblemente arcano sistema autoconf ha sido utilizado para

producir scripts de shell para configurar automáticamente packages de código fuente de software. Estos scripts pueden adaptar los packages a muchos types de sistemas tipo UNIX sin la intervención manual del usuario. Autoconf crea un script de configuration para un package desde un file de plantilla que enumera las características del sistema operativo que el package puede usar, en forma de llamadas a macro M4.

Si eso no es suficientemente aterrador, espere hasta que intente escribir su primer script autoconf. Los autores de autoconf no son tímidos acerca de su dificultad :

Aquellos que no entienden Autoconf están condenados a redeviselo, pobremente. El objective principal de Autoconf es facilitar la vida del usuario; hacer la vida del mantenedor más fácil es solo un objective secundario. Dicho de otra manera, el objective principal no es hacer que la generación de configuration sea automática para los mantenedores de packages; más bien, el objective es hacer que la configuration sea sencilla, portátil y pnetworkingecible para el usuario final de cada package autoconfigurado. Y hasta este punto, Autoconf tiene un gran éxito en su objective: la mayoría de las quejas sobre la list de Autoconf se refieren a las dificultades para escribir la input de Autoconf, y no al comportamiento de la configuration resultante.

Por otro lado, saldrás del process sabiendo más sobre los pedazos de varios sistemas de lo que nunca hubieras imaginado.

En estos días, personalmente, supongo que una distribución Debian-ish mucho más estándar fue mi objective y no me obligué a escribir otro script autoconf. Tengo la suerte de tener el lujo de elegir eso; es posible que no tenga tanta libertad.

Esta no es una tarea sencilla de automatizar, porque una secuencia de commands puede usar construcciones que anulan el análisis estático. Si alguna vez usa eval o cualquier prefijo como time o nice , no será tan simple como ejecutar algo como egrep -o '^[^ ]+ ? ' egrep -o '^[^ ]+ ? ' para get commands y ejecutarlos a través de los which o type .

Al final, la única forma de estar absolutamente seguro es ejecutar el script y descubrir qué falla. Si un script está bien escrito, comprobará si hay commands no estándar antes de ejecutarlo. De lo contrario, testing y error es la única manera de estar seguro.

Habiendo dicho eso, algo como esto podría ayudar:

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

La salida se verá así:

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