检查bash / shell脚本依赖性


13

是否有方法/命令来检查bash脚本的依赖性?换句话说,对以下问题的回答:用户应安装哪些库来运行脚本?

我可以通过阅读脚本并检查其调用的其他库/命令来手动执行此操作,但这对于长脚本来说并不明显。

Answers:


8

令人难以置信的奥秘autoconf系统已用于

生成shell脚本以自动配置软件源代码包。这些脚本可以使程序包适应许多类UNIX系统,而无需人工干预。Autoconf通过模板文件为软件包创建配置脚本,该模板文件以M4宏调用的形式列出了软件包可以使用的操作系统功能。

如果那还不够吓人,请等到尝试编写第一个autoconf脚本。autoconf的作者并不畏惧它的困难

那些不了解Autoconf的人被谴责重塑它,可怜的是。Autoconf的主要目标是使用户的生活更轻松;使维护者的生活更轻松只是第二个目标。换句话说,主要目标不是使软件包维护者的配置自动生成。相反,目标是使每个自动没收软件包的最终用户配置起来轻松,可移植且可预测。从这个意义上讲,Autoconf在目标方面非常成功-对Autoconf列表的大多数抱怨是关于编写Autoconf输入的困难,而不是结果配置的行为。

另一方面,您将从过程中脱颖而出,比以往任何时候都更加了解各种系统的精巧之处。

这些天,就我个人而言,我将以更标准的Debian-ish发行版为目标,而不是自己编写另一个autoconf脚本。我很幸运能有这样的选择。您可能没有那么宽容。


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.