可以测试特定库的 Bash 脚本

可以测试特定库的 Bash 脚本

我正在编写一个 bash 脚本,需要测试 VPS 上是否安装了某些库,如果没有,脚本将安装它们。

我的问题是能够让脚本确定它们是否存在。我的主要想法是使用这个:

ldd /usr/lib/libgd.so > /tmp/lddcheck 2>/dev/null

将 ldd 结果输出到一个文件,然后我可以使用 grep 或其他东西来搜索我正在寻找的库。如果它们不存在,我将安装它们,否则脚本将继续。

不确定具体该怎么做。任何帮助将不胜感激(对于 bash 脚本来说相当新)。

答案1

鉴于你将要使用某种包管理器来安装库,仅仅拥有您需要的包列表不是更容易吗?要安装并以某种方式确保它们已安装?

据我所知,100% 的包管理器都有某种模式(通常是默认模式),如果未安装包,则安装它;如果已安装但旧版本,则将其更新到最新版本;如果它已经是最新的,则直接通过。

例如,apt-get您始终可以apt-get install a b c d ...确保已安装软件包a, b, c, 。d随之yum而来的是yum install a b c d,等等。

如果您在 VPS 中使用具有不同包管理器的各种系统,那么您最终将编写一些逻辑来检测它使用哪个包管理器,因此这一步是不可避免的。

答案2

按照建议执行 ldd 命令后,您可以尝试使用类似的命令

grep "not found" /tmp/lddcheck | awk '// { print $1 }'

获取丢失的库的名称。

答案3

假设您需要的库支持它,您应该使用pkg-config,这就是它的用途。

$ pkg-config --exists libnotify 
$ echo $?
0
$ pkg-config --exists nonexistant
$ echo $?
1
$ 

您可以使用它来检查版本,告诉您包含或库路径等。

答案4

如果您不熟悉脚本编写,请记住这一点:您很少需要临时文件;您很少需要临时文件。当您需要对某些数据进行多个阶段的处理时,请使用管道。您可以在 的输出上使用许多文本处理工具ldd。在这里,我将使用awk, 来检测第三个空格分隔字段所在的行not(而不是库的路径),并打印第一个字段(库名称)。我将输出收集到一个变量中,该变量将包含以空格分隔的缺失库列表。

missing=$(ldd /path/to/executable | awk '$3 == "not" {print $1}')
for x in $missing; do
  # whatever it takes to install $x
done

请注意,这可能不是正确的方法。如果您要支持特定发行版,则不要制作与包管理器进行自定义交互的通用二进制包。为该发行版分发一个包。

包管理器使系统管理员的工作变得更加轻松;不能很好地使用包管理器会让你的用户感到困惑和愤怒。如果您分发 rpm 和 deb 等,您的用户只需要安装您的软件包的依赖项即可。这样,你的包就会被记录下来,并且可以使用用户习惯的包管理工具来安装、升级和卸载,而不是通过执行一些可疑的脚本。

相关内容