检查 bash/shell 脚本依赖项

4m1*_*4j1 12 scripting bash shell-script

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

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

msw*_*msw 8

令人难以置信的神秘自动配置系统已被用于

生成shell脚本来自动配置软件源代码包。这些脚本可以使包适应多种类 UNIX 系统,而无需用户手动干预。Autoconf 从一个模板文件中创建一个包的配置脚本,该文件以 M4 宏调用的形式列出了包可以使用的操作系统功能。

如果这还不够可怕,请等到您尝试编写第一个 autoconf 脚本。autoconf 的作者对它的困难并不害羞

那些不了解 Autoconf 的人注定要重新发明它,很糟糕。Autoconf 的主要目标是让用户的生活更轻松;让维护者的生活更轻松只是次要目标。换句话说,主要目标不是让包维护者自动生成配置;相反,目标是为每个自动没收的包的最终用户提供轻松、便携和可预测的配置。在这个程度上,Autoconf 在它的目标上是非常成功的——对 Autoconf 列表的大多数抱怨是关于编写 Autoconf 输入的困难,而不是结果配置的行为。

另一方面,你会从这个过程中了解比你想象的更多的各种系统的繁琐部分。

这些天,我个人认为更标准的 Debian-ish 发行版是我的目标,而不是让自己编写另一个 autoconf 脚本。我很幸运能有幸选择它;你可能没有这样的宽容度。


小智 6

这不是一个简单的自动化任务,因为脚本可能使用无法进行静态分析的构造。如果它曾经使用evalor 任何像timeor之类的前缀nice,那么它不会像运行类似egrep -o '^[^ ]+ ? '获取命令并通过whichor运行它们那么简单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
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

$ ./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
Run Code Online (Sandbox Code Playgroud)