![检查 bash/shell 脚本依赖关系](https://linux22.com/image/36790/%E6%A3%80%E6%9F%A5%20bash%2Fshell%20%E8%84%9A%E6%9C%AC%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB.png)
是否有方法/命令来检查 bash 脚本的依赖关系?换句话说,回答这个问题:用户应该安装哪些库来运行脚本?
我可以通过阅读脚本并检查它调用的其他库/命令来手动执行此操作,但这对于长脚本来说并不明显。
答案1
令人难以置信的神秘自动配置系统已经习惯了
生成shell脚本来自动配置软件源代码包。这些脚本可以使软件包适应多种类 UNIX 系统,而无需用户手动干预。 Autoconf 从模板文件创建包的配置脚本,该文件以 M4 宏调用的形式列出了包可以使用的操作系统功能。
如果这还不够可怕,请等到您尝试编写第一个 autoconf 脚本。 autoconf 的作者不回避它的困难:
那些不理解 Autoconf 的人注定会糟糕地重新发明它。 Autoconf 的主要目标是让用户的生活更轻松;让维护者的生活更轻松只是次要目标。换句话说,主要目标不是让包维护者自动生成配置;而是让配置自动生成。相反,我们的目标是使每个自动没收包裹的最终用户的配置变得轻松、便携且可预测。从这个意义上说,Autoconf 在其目标上非常成功——对 Autoconf 列表的大多数抱怨都是关于编写 Autoconf 输入的困难,而不是最终配置的行为。
另一方面,在这个过程中,您将比您想象的更了解各种系统的复杂部分。
如今,就我个人而言,我会假设一个更标准的 Debian 风格的发行版是我的目标,而不是让自己编写另一个 autoconf 脚本。我很幸运能够有幸做出这样的选择;你可能没有这样的自由度。
答案2
这不是一个简单的自动化任务,因为脚本可能使用无法进行静态分析的构造。如果它曾经使用or 任何像oreval
之类的前缀,那么它不会像运行类似获取命令并通过or运行它们那么简单。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
答案3
您可以通过以下方式从一个文件夹获取 .sh 文件列表:
find \ordnerpfad -type f
如果您找到了从 .sh 文件中获取命令列表的方法,您可以通过以下方式检查您的系统是否支持这些命令:
compgen -ac | grep searchstr
要获取 .sh 文件使用的命令的列表,也许可以通过以下形式之一来获取不工作一个样本:
输出脚本使用的命令列表也许可以通过以下方式创建使用的命令列表:
设置-n file_which_need_to_check.sh > 找到_commands.txt
或者通过以下内容:
compgen -c file_which_need_to_check.sh >found_commands.txt
或者通过以下方式:
shellcheck -x 或像这样:
https://www.shellcheck.net/
https://github.com/koalaman/shellcheck
请随意改进这一点。